<!DOCTYPE html>
<!-- saved from url=(0038)https://www.jianshu.com/p/7e1e8d8e8ec5 -->
<html><!--<![endif]--><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">

  <!-- Start of Baidu Transcode -->
  <meta http-equiv="Cache-Control" content="no-siteapp">
  <meta http-equiv="Cache-Control" content="no-transform">
  <meta name="applicable-device" content="pc,mobile">
  <meta name="MobileOptimized" content="width">
  <meta name="HandheldFriendly" content="true">
  <meta name="mobile-agent" content="format=html5;url=https://www.jianshu.com/p/7e1e8d8e8ec5">
  <!-- End of Baidu Transcode -->

    <meta name="description" content="1、传统我们的项目开发模式是产品调研提出需求，开发团队研究决定开发方案选型。然后开始一个周期的开发，模块开发完成之后开始模块间的联调。联调结束之后打包交付给测试团队。测试团队，系统测试或自动化测试，然后提交bug，开发团队修复bug，周而复始。 2、传统的模式中，存在着较多的不确定因素。例如，开发环境、编译环境、测试环境、生产环境，等不确定因素。人为介入打包中的不确定因素，缺乏单元测试和自动...">

  <meta name="360-site-verification" content="604a14b53c6b871206001285921e81d8">
  <meta property="wb:webmaster" content="294ec9de89e7fadb">
  <meta property="qc:admins" content="104102651453316562112116375">
  <meta property="qc:admins" content="11635613706305617">
  <meta property="qc:admins" content="1163561616621163056375">
  <meta name="google-site-verification" content="cV4-qkUJZR6gmFeajx_UyPe47GW9vY6cnCrYtCHYNh4">
  <meta name="google-site-verification" content="HF7lfF8YEGs1qtCE-kPml8Z469e2RHhGajy6JPVy5XI">
  <meta http-equiv="mobile-agent" content="format=html5; url=https://www.jianshu.com/p/7e1e8d8e8ec5">

  <!-- Apple -->
  <meta name="apple-mobile-web-app-title" content="简书">

    <!--  Meta for Smart App Banner -->
  <meta name="apple-itunes-app" content="app-id=888237539, app-argument=jianshu://notes/11747498">
  <!-- End -->

  <!--  Meta for Twitter Card -->
  <meta content="summary" property="twitter:card">
  <meta content="@jianshucom" property="twitter:site">
  <meta content="基于Docker的Jenkins pipeline工作流." property="twitter:title">
  <meta content="1、传统我们的项目开发模式是产品调研提出需求，开发团队研究决定开发方案选型。然后开始一个周期的开发，模块开发完成之后开始模块间的联调。联调结束之后打包交付给测试团队。测试团队..." property="twitter:description">
  <meta content="https://www.jianshu.com/p/7e1e8d8e8ec5" property="twitter:url">
  <!-- End -->

  <!--  Meta for OpenGraph -->
  <meta property="fb:app_id" content="865829053512461">
  <meta property="og:site_name" content="简书">
  <meta property="og:title" content="基于Docker的Jenkins pipeline工作流.">
  <meta property="og:type" content="article">
  <meta property="og:url" content="https://www.jianshu.com/p/7e1e8d8e8ec5">
  <meta property="og:description" content="1、传统我们的项目开发模式是产品调研提出需求，开发团队研究决定开发方案选型。然后开始一个周期的开发，模块开发完成之后开始模块间的联调。联调结束之后打包交付给测试团队。测试团队，系统测试或自动化测...">
  <!-- End -->

  <!--  Meta for Facebook Applinks -->
  <meta property="al:ios:url" content="jianshu://notes/11747498">
  <meta property="al:ios:app_store_id" content="888237539">
  <meta property="al:ios:app_name" content="简书">

  <meta property="al:android:url" content="jianshu://notes/11747498">
  <meta property="al:android:package" content="com.jianshu.haruki">
  <meta property="al:android:app_name" content="简书">
  <!-- End -->


    <title>基于Docker的Jenkins pipeline工作流. - 简书</title>

  <meta name="csrf-param" content="authenticity_token">
<meta name="csrf-token" content="91bxToOKEb2e0Kv0kxv5MHSUsMoysdonySfQwq9B24pNVHTV9SnKl4xkRUr0GbJLa7Pz40PwYqnBQJ1NYPm0tw==">

  <link rel="stylesheet" media="all" href="./基于Docker的Jenkins pipeline工作流. - 简书_files/web-56188f038c06ce022e40.css">
  
  <link rel="stylesheet" media="all" href="./基于Docker的Jenkins pipeline工作流. - 简书_files/entry-a9201972e0c141d2fe27.css">

  <link href="https://cdn2.jianshu.io/assets/favicons/favicon-e743bfb1821442341c3ab15bdbe804f7ad97676bd07a770ccc9483473aa76f06.ico" rel="shortcut icon" type="image/x-icon">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/57-a6f1f1ee62ace44f6dc2f6a08575abd3c3b163288881c78dd8d75247682a4b27.png" sizes="57x57">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/72-fb9834bcfce738fd7b9c5e31363e79443e09a81a8e931170b58bc815387c1562.png" sizes="72x72">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/76-49d88e539ff2489475d603994988d871219141ecaa0b1a7a9a1914f4fe3182d6.png" sizes="76x76">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/114-24252fe693524ed3a9d0905e49bff3cbd0228f25a320aa09053c2ebb4955de97.png" sizes="114x114">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/120-1bb7371f5e87f93ce780a5f1a05ff1b176828ee0d1d130e768575918a2e05834.png" sizes="120x120">
      <link rel="apple-touch-icon-precomposed" href="https://cdn2.jianshu.io/assets/apple-touch-icons/152-bf209460fc1c17bfd3e2b84c8e758bc11ca3e570fd411c3bbd84149b97453b99.png" sizes="152x152">

  <!-- Start of 访问统计 -->
    <script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/push.js.下载"></script><script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/hm.js.下载"></script><script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?0c0e9d9b1e7d617b3e6842e85b9fb068";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>

  <!-- End of 访问统计 -->
<style type="text/css">fieldset[disabled] .multiselect {
  pointer-events: none;
}

.multiselect__spinner {
  position: absolute;
  right: 1px;
  top: 1px;
  width: 48px;
  height: 35px;
  background: #fff;
  display: block;
}

.multiselect__spinner:after,
.multiselect__spinner:before {
  position: absolute;
  content: "";
  top: 50%;
  left: 50%;
  margin: -8px 0 0 -8px;
  width: 16px;
  height: 16px;
  border-radius: 100%;
  border-color: #41b883 transparent transparent;
  border-style: solid;
  border-width: 2px;
  box-shadow: 0 0 0 1px transparent;
}

.multiselect__spinner:before {
  animation: a 2.4s cubic-bezier(.41,.26,.2,.62);
  animation-iteration-count: infinite;
}

.multiselect__spinner:after {
  animation: a 2.4s cubic-bezier(.51,.09,.21,.8);
  animation-iteration-count: infinite;
}

.multiselect__loading-enter-active,
.multiselect__loading-leave-active {
  transition: opacity .4s ease-in-out;
  opacity: 1;
}

.multiselect__loading-enter,
.multiselect__loading-leave-active {
  opacity: 0;
}

.multiselect,
.multiselect__input,
.multiselect__single {
  font-family: inherit;
  font-size: 14px;
  -ms-touch-action: manipulation;
  touch-action: manipulation;
}

.multiselect {
  box-sizing: content-box;
  display: block;
  position: relative;
  width: 100%;
  min-height: 40px;
  text-align: left;
  color: #35495e;
}

.multiselect * {
  box-sizing: border-box;
}

.multiselect:focus {
  outline: none;
}

.multiselect--disabled {
  opacity: .6;
}

.multiselect--active {
  z-index: 1;
}

.multiselect--active:not(.multiselect--above) .multiselect__current,
.multiselect--active:not(.multiselect--above) .multiselect__input,
.multiselect--active:not(.multiselect--above) .multiselect__tags {
  border-bottom-left-radius: 0;
  border-bottom-right-radius: 0;
}

.multiselect--active .multiselect__select {
  transform: rotate(180deg);
}

.multiselect--above.multiselect--active .multiselect__current,
.multiselect--above.multiselect--active .multiselect__input,
.multiselect--above.multiselect--active .multiselect__tags {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}

.multiselect__input,
.multiselect__single {
  position: relative;
  display: inline-block;
  min-height: 20px;
  line-height: 20px;
  border: none;
  border-radius: 5px;
  background: #fff;
  padding: 0 0 0 5px;
  width: 100%;
  transition: border .1s ease;
  box-sizing: border-box;
  margin-bottom: 8px;
  vertical-align: top;
}

.multiselect__tag~.multiselect__input,
.multiselect__tag~.multiselect__single {
  width: auto;
}

.multiselect__input:hover,
.multiselect__single:hover {
  border-color: #cfcfcf;
}

.multiselect__input:focus,
.multiselect__single:focus {
  border-color: #a8a8a8;
  outline: none;
}

.multiselect__single {
  padding-left: 6px;
  margin-bottom: 8px;
}

.multiselect__tags-wrap {
  display: inline;
}

.multiselect__tags {
  min-height: 40px;
  display: block;
  padding: 8px 40px 0 8px;
  border-radius: 5px;
  border: 1px solid #e8e8e8;
  background: #fff;
}

.multiselect__tag {
  position: relative;
  display: inline-block;
  padding: 4px 26px 4px 10px;
  border-radius: 5px;
  margin-right: 10px;
  color: #fff;
  line-height: 1;
  background: #41b883;
  margin-bottom: 5px;
  white-space: nowrap;
  overflow: hidden;
  max-width: 100%;
  text-overflow: ellipsis;
}

.multiselect__tag-icon {
  cursor: pointer;
  margin-left: 7px;
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  font-weight: 700;
  font-style: normal;
  width: 22px;
  text-align: center;
  line-height: 22px;
  transition: all .2s ease;
  border-radius: 5px;
}

.multiselect__tag-icon:after {
  content: "\D7";
  color: #266d4d;
  font-size: 14px;
}

.multiselect__tag-icon:focus,
.multiselect__tag-icon:hover {
  background: #369a6e;
}

.multiselect__tag-icon:focus:after,
.multiselect__tag-icon:hover:after {
  color: #fff;
}

.multiselect__current {
  min-height: 40px;
  overflow: hidden;
  padding: 8px 12px 0;
  padding-right: 30px;
  white-space: nowrap;
  border-radius: 5px;
  border: 1px solid #e8e8e8;
}

.multiselect__current,
.multiselect__select {
  line-height: 16px;
  box-sizing: border-box;
  display: block;
  margin: 0;
  text-decoration: none;
  cursor: pointer;
}

.multiselect__select {
  position: absolute;
  width: 40px;
  height: 38px;
  right: 1px;
  top: 1px;
  padding: 4px 8px;
  text-align: center;
  transition: transform .2s ease;
}

.multiselect__select:before {
  position: relative;
  right: 0;
  top: 65%;
  color: #999;
  margin-top: 4px;
  border-style: solid;
  border-width: 5px 5px 0;
  border-color: #999 transparent transparent;
  content: "";
}

.multiselect__placeholder {
  color: #adadad;
  display: inline-block;
  margin-bottom: 10px;
  padding-top: 2px;
}

.multiselect--active .multiselect__placeholder {
  display: none;
}

.multiselect__content-wrapper {
  position: absolute;
  display: block;
  background: #fff;
  width: 100%;
  max-height: 240px;
  overflow: auto;
  border: 1px solid #e8e8e8;
  border-top: none;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  z-index: 1;
  -webkit-overflow-scrolling: touch;
}

.multiselect__content {
  list-style: none;
  display: inline-block;
  padding: 0;
  margin: 0;
  min-width: 100%;
  vertical-align: top;
}

.multiselect--above .multiselect__content-wrapper {
  bottom: 100%;
  border-bottom-left-radius: 0;
  border-bottom-right-radius: 0;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
  border-bottom: none;
  border-top: 1px solid #e8e8e8;
}

.multiselect__content::webkit-scrollbar {
  display: none;
}

.multiselect__element {
  display: block;
}

.multiselect__option {
  display: block;
  padding: 12px;
  min-height: 40px;
  line-height: 16px;
  text-decoration: none;
  text-transform: none;
  vertical-align: middle;
  position: relative;
  cursor: pointer;
  white-space: nowrap;
}

.multiselect__option:after {
  top: 0;
  right: 0;
  position: absolute;
  line-height: 40px;
  padding-right: 12px;
  padding-left: 20px;
}

.multiselect__option--highlight {
  background: #41b883;
  outline: none;
  color: #fff;
}

.multiselect__option--highlight:after {
  content: attr(data-select);
  background: #41b883;
  color: #fff;
}

.multiselect__option--selected {
  background: #f3f3f3;
  color: #35495e;
  font-weight: 700;
}

.multiselect__option--selected:after {
  content: attr(data-selected);
  color: silver;
}

.multiselect__option--selected.multiselect__option--highlight {
  background: #ff6a6a;
  color: #fff;
}

.multiselect__option--selected.multiselect__option--highlight:after {
  background: #ff6a6a;
  content: attr(data-deselect);
  color: #fff;
}

.multiselect--disabled {
  background: #ededed;
  pointer-events: none;
}

.multiselect--disabled .multiselect__current,
.multiselect--disabled .multiselect__select,
.multiselect__option--disabled {
  background: #ededed;
  color: #a6a6a6;
}

.multiselect__option--disabled {
  cursor: text;
  pointer-events: none;
}

.multiselect__option--disabled.multiselect__option--highlight {
  background: #dedede!important;
}

.multiselect-enter-active,
.multiselect-leave-active {
  transition: all .15s ease;
}

.multiselect-enter,
.multiselect-leave-active {
  opacity: 0;
}

.multiselect__strong {
  margin-bottom: 8px;
  line-height: 20px;
  display: inline-block;
  vertical-align: top;
}

[dir=rtl] .multiselect {
  text-align: right;
}

[dir=rtl] .multiselect__select {
  right: auto;
  left: 1px;
}

[dir=rtl] .multiselect__tags {
  padding: 8px 8px 0 40px;
}

[dir=rtl] .multiselect__content {
  text-align: right;
}

[dir=rtl] .multiselect__option:after {
  right: auto;
  left: 0;
}

[dir=rtl] .multiselect__clear {
  right: auto;
  left: 12px;
}

[dir=rtl] .multiselect__spinner {
  right: auto;
  left: 1px;
}

@keyframes a {
  0% {
    transform: rotate(0);
  }

  to {
    transform: rotate(2turn);
  }
}</style><style type="text/css">@font-face {
  font-family: 'KaTeX_AMS';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_AMS-Regular-3d8245dcb4489694a6a263b05c1cca01.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_AMS-Regular-ac1d46d953d403677171697581a284d2.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_AMS-Regular-c67be87adba7d31c013be127b936233d.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Caligraphic';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Bold-970d3e76493b82fccf21ad5888ddee77.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Bold-445f96a387df0d13ded71f27c608516d.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Bold-3f61a84d76e80396489d32bc9dd8d444.ttf) format('truetype');
  font-weight: bold;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Caligraphic';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Regular-0ef0f2e356a2e1c457b6585d34edae77.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Regular-74f6918c7d2b768ffd32048102bc0172.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Caligraphic-Regular-c3bc8fcec0e85a50cabf71e4e8074991.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Fraktur';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Bold-950649ba5e5cfd37cdad74095411d350.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Bold-1aca7ef7f976fb54a207ffc8aa180e38.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Bold-e11e6bf02fc41279a540d3655abf3b07.ttf) format('truetype');
  font-weight: bold;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Fraktur';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Regular-135ccd74931753318f6f52f3fce19018.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Regular-c5b430bfcb3e5423b77401afcdb69b66.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Fraktur-Regular-a9509497466d16e6b7265a223ea39093.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Main';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Bold-82bce349c8ff0927380b5177e9258ad0.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Bold-29d4b276c622ff1d1376d9afcbd2f25a.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Bold-db576c7d5d6eb6ebefc9b334f4140d42.ttf) format('truetype');
  font-weight: bold;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Main';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-BoldItalic-13900e552dbf51aead905f897043226c.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-BoldItalic-3f3be43bbdd58a4a86c8eddd3d39a26a.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-BoldItalic-cec43f729e0e6810c3433f6020ec676e.ttf) format('truetype');
  font-weight: bold;
  font-style: italic;
}

@font-face {
  font-family: 'KaTeX_Main';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Italic-b488f60f79c9d1f533def644385d8219.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Italic-f8a754484e776e94b6116dfbcb1761a7.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Italic-85b3329fdb41fadfb0fdc01ec5290b2f.ttf) format('truetype');
  font-weight: normal;
  font-style: italic;
}

@font-face {
  font-family: 'KaTeX_Main';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Regular-999cd6bac6e8118065ac500d4f133c63.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Regular-485696cf1d821baac6ae06c42e09faef.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Main-Regular-f4fe6dca4a5f5520ae0caab31848aae3.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Math';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Math-Italic-7a31741a44e58952cb4b8a763c206fcd.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Math-Italic-8eb56b3ff5b141cd3732a24e65c2b339.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Math-Italic-10740d7488d690a743339650103f1cb3.ttf) format('truetype');
  font-weight: normal;
  font-style: italic;
}

@font-face {
  font-family: 'KaTeX_SansSerif';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Bold-0d0f967a34b828083a11bb264e578c32.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Bold-99bd87431ac7ef8f27591f72d7812509.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Bold-771a1f955e7ff2106402b58d1e8a1ad2.ttf) format('truetype');
  font-weight: bold;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_SansSerif';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Italic-b1ac79b9b69c954bbeb8fc02500832e0.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Italic-9c3f03ec809c6f298d716cbda8260fcb.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Italic-cb729d47fbd26ff0ae62bb840085e5b5.ttf) format('truetype');
  font-weight: normal;
  font-style: italic;
}

@font-face {
  font-family: 'KaTeX_SansSerif';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Regular-23f1730fda70ec6ec6aa789979890cba.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Regular-fc90839714a9e877682309c3daf7493e.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_SansSerif-Regular-43b0cb92c2405f175772931ccd68002e.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Script';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Script-Regular-ae1fad1f4d1c227c9d567da8ea9f988c.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Script-Regular-60febfa114c5e32f0ce73050476aa39f.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Script-Regular-e9169ca7b32608b6235ec9ffff742a71.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Size1';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size1-Regular-fda0824e8cfb676664ad063c367cfce3.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size1-Regular-1d6cf6b89f694dc76e13ecc4e8214dd2.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size1-Regular-f2e296ef7cef0f6f16912e5d171929b2.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Size2';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size2-Regular-a7a0eb93afb696cb9b4efb87e6cd45a3.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size2-Regular-f48e83b7bcaa68a86a78e8edfee1a04e.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size2-Regular-0767ede65042583bcc06f09055f4d7ca.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Size3';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size3-Regular-397bd6872be7adff4f000c49fa85a9c3.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size3-Regular-0387ab387ace32f15b43c3a4a39f187f.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size3-Regular-882f723427a0986846fe786bd8d6f6c7.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Size4';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size4-Regular-3c14ed11dd8eea981c93bf283193856d.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size4-Regular-726db3bd435c8a6e45e44741dae67263.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Size4-Regular-27901d5ce93d8971c416d9123fedb911.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

@font-face {
  font-family: 'KaTeX_Typewriter';
  src: url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Typewriter-Regular-895baecfbf4ef298fdfe943fb117c15e.woff2) format('woff2'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Typewriter-Regular-696705de367f02534e8abb38b55af067.woff) format('woff'), url(//cdn2.jianshu.io/assets/_/_/_/_/shared/node_modules/katex/dist/fonts/KaTeX_Typewriter-Regular-6374f53e08c02d7b9ec594e2fb0c5fe8.ttf) format('truetype');
  font-weight: normal;
  font-style: normal;
}

.katex-display {
  display: block;
  margin: 1em 0;
  text-align: center;
}

.katex-display > .katex {
  display: inline-block;
  text-align: initial;
}

.katex {
  font: normal 1.21em KaTeX_Main, Times New Roman, serif;
  line-height: 1.2;
  white-space: nowrap;
  text-indent: 0;
  text-rendering: auto;
}

.katex * {
  -ms-high-contrast-adjust: none !important;
}

.katex .katex-html {
  display: inline-block;
}

.katex .katex-mathml {
  position: absolute;
  clip: rect(1px, 1px, 1px, 1px);
  padding: 0;
  border: 0;
  height: 1px;
  width: 1px;
  overflow: hidden;
}

.katex .base {
  position: relative;
  display: inline-block;
}

.katex .strut {
  display: inline-block;
}

.katex .textbf {
  font-weight: bold;
}

.katex .textit {
  font-style: italic;
}

.katex .textrm {
  font-family: KaTeX_Main;
}

.katex .textsf {
  font-family: KaTeX_SansSerif;
}

.katex .texttt {
  font-family: KaTeX_Typewriter;
}

.katex .mathit {
  font-family: KaTeX_Math;
  font-style: italic;
}

.katex .mathrm {
  font-style: normal;
}

.katex .mathbf {
  font-family: KaTeX_Main;
  font-weight: bold;
}

.katex .boldsymbol {
  font-family: KaTeX_Math;
  font-weight: bold;
  font-style: italic;
}

.katex .amsrm {
  font-family: KaTeX_AMS;
}

.katex .mathbb {
  font-family: KaTeX_AMS;
}

.katex .mathcal {
  font-family: KaTeX_Caligraphic;
}

.katex .mathfrak {
  font-family: KaTeX_Fraktur;
}

.katex .mathtt {
  font-family: KaTeX_Typewriter;
}

.katex .mathscr {
  font-family: KaTeX_Script;
}

.katex .mathsf {
  font-family: KaTeX_SansSerif;
}

.katex .mainit {
  font-family: KaTeX_Main;
  font-style: italic;
}

.katex .mainrm {
  font-family: KaTeX_Main;
  font-style: normal;
}

.katex .vlist-t {
  display: inline-table;
  table-layout: fixed;
}

.katex .vlist-r {
  display: table-row;
}

.katex .vlist {
  display: table-cell;
  vertical-align: bottom;
  position: relative;
}

.katex .vlist > span {
  display: block;
  height: 0;
  position: relative;
}

.katex .vlist > span > span {
  display: inline-block;
}

.katex .vlist > span > .pstrut {
  overflow: hidden;
  width: 0;
}

.katex .vlist-t2 {
  margin-right: -2px;
}

.katex .vlist-s {
  display: table-cell;
  vertical-align: bottom;
  font-size: 1px;
  width: 2px;
}

.katex .msupsub {
  text-align: left;
}

.katex .mfrac > span > span {
  text-align: center;
}

.katex .mfrac .frac-line {
  display: inline-block;
  width: 100%;
}

.katex .mspace {
  display: inline-block;
}

.katex .mspace.negativethinspace {
  margin-left: -0.16667em;
}

.katex .mspace.muspace {
  width: 0.055556em;
}

.katex .mspace.thinspace {
  width: 0.16667em;
}

.katex .mspace.negativemediumspace {
  margin-left: -0.22222em;
}

.katex .mspace.mediumspace {
  width: 0.22222em;
}

.katex .mspace.thickspace {
  width: 0.27778em;
}

.katex .mspace.sixmuspace {
  width: 0.333333em;
}

.katex .mspace.eightmuspace {
  width: 0.444444em;
}

.katex .mspace.enspace {
  width: 0.5em;
}

.katex .mspace.twelvemuspace {
  width: 0.666667em;
}

.katex .mspace.quad {
  width: 1em;
}

.katex .mspace.qquad {
  width: 2em;
}

.katex .llap,
.katex .rlap,
.katex .clap {
  width: 0;
  position: relative;
}

.katex .llap > .inner,
.katex .rlap > .inner,
.katex .clap > .inner {
  position: absolute;
}

.katex .llap > .fix,
.katex .rlap > .fix,
.katex .clap > .fix {
  display: inline-block;
}

.katex .llap > .inner {
  right: 0;
}

.katex .rlap > .inner,
.katex .clap > .inner {
  left: 0;
}

.katex .clap > .inner > span {
  margin-left: -50%;
  margin-right: 50%;
}

.katex .rule {
  display: inline-block;
  border: solid 0;
  position: relative;
}

.katex .overline .overline-line,
.katex .underline .underline-line {
  display: inline-block;
  width: 100%;
}

.katex .sqrt > .root {
  margin-left: 0.27777778em;
  margin-right: -0.55555556em;
}

.katex .sizing,
.katex .fontsize-ensurer {
  display: inline-block;
}

.katex .sizing.reset-size1.size1,
.katex .fontsize-ensurer.reset-size1.size1 {
  font-size: 1em;
}

.katex .sizing.reset-size1.size2,
.katex .fontsize-ensurer.reset-size1.size2 {
  font-size: 1.2em;
}

.katex .sizing.reset-size1.size3,
.katex .fontsize-ensurer.reset-size1.size3 {
  font-size: 1.4em;
}

.katex .sizing.reset-size1.size4,
.katex .fontsize-ensurer.reset-size1.size4 {
  font-size: 1.6em;
}

.katex .sizing.reset-size1.size5,
.katex .fontsize-ensurer.reset-size1.size5 {
  font-size: 1.8em;
}

.katex .sizing.reset-size1.size6,
.katex .fontsize-ensurer.reset-size1.size6 {
  font-size: 2em;
}

.katex .sizing.reset-size1.size7,
.katex .fontsize-ensurer.reset-size1.size7 {
  font-size: 2.4em;
}

.katex .sizing.reset-size1.size8,
.katex .fontsize-ensurer.reset-size1.size8 {
  font-size: 2.88em;
}

.katex .sizing.reset-size1.size9,
.katex .fontsize-ensurer.reset-size1.size9 {
  font-size: 3.456em;
}

.katex .sizing.reset-size1.size10,
.katex .fontsize-ensurer.reset-size1.size10 {
  font-size: 4.148em;
}

.katex .sizing.reset-size1.size11,
.katex .fontsize-ensurer.reset-size1.size11 {
  font-size: 4.976em;
}

.katex .sizing.reset-size2.size1,
.katex .fontsize-ensurer.reset-size2.size1 {
  font-size: 0.83333333em;
}

.katex .sizing.reset-size2.size2,
.katex .fontsize-ensurer.reset-size2.size2 {
  font-size: 1em;
}

.katex .sizing.reset-size2.size3,
.katex .fontsize-ensurer.reset-size2.size3 {
  font-size: 1.16666667em;
}

.katex .sizing.reset-size2.size4,
.katex .fontsize-ensurer.reset-size2.size4 {
  font-size: 1.33333333em;
}

.katex .sizing.reset-size2.size5,
.katex .fontsize-ensurer.reset-size2.size5 {
  font-size: 1.5em;
}

.katex .sizing.reset-size2.size6,
.katex .fontsize-ensurer.reset-size2.size6 {
  font-size: 1.66666667em;
}

.katex .sizing.reset-size2.size7,
.katex .fontsize-ensurer.reset-size2.size7 {
  font-size: 2em;
}

.katex .sizing.reset-size2.size8,
.katex .fontsize-ensurer.reset-size2.size8 {
  font-size: 2.4em;
}

.katex .sizing.reset-size2.size9,
.katex .fontsize-ensurer.reset-size2.size9 {
  font-size: 2.88em;
}

.katex .sizing.reset-size2.size10,
.katex .fontsize-ensurer.reset-size2.size10 {
  font-size: 3.45666667em;
}

.katex .sizing.reset-size2.size11,
.katex .fontsize-ensurer.reset-size2.size11 {
  font-size: 4.14666667em;
}

.katex .sizing.reset-size3.size1,
.katex .fontsize-ensurer.reset-size3.size1 {
  font-size: 0.71428571em;
}

.katex .sizing.reset-size3.size2,
.katex .fontsize-ensurer.reset-size3.size2 {
  font-size: 0.85714286em;
}

.katex .sizing.reset-size3.size3,
.katex .fontsize-ensurer.reset-size3.size3 {
  font-size: 1em;
}

.katex .sizing.reset-size3.size4,
.katex .fontsize-ensurer.reset-size3.size4 {
  font-size: 1.14285714em;
}

.katex .sizing.reset-size3.size5,
.katex .fontsize-ensurer.reset-size3.size5 {
  font-size: 1.28571429em;
}

.katex .sizing.reset-size3.size6,
.katex .fontsize-ensurer.reset-size3.size6 {
  font-size: 1.42857143em;
}

.katex .sizing.reset-size3.size7,
.katex .fontsize-ensurer.reset-size3.size7 {
  font-size: 1.71428571em;
}

.katex .sizing.reset-size3.size8,
.katex .fontsize-ensurer.reset-size3.size8 {
  font-size: 2.05714286em;
}

.katex .sizing.reset-size3.size9,
.katex .fontsize-ensurer.reset-size3.size9 {
  font-size: 2.46857143em;
}

.katex .sizing.reset-size3.size10,
.katex .fontsize-ensurer.reset-size3.size10 {
  font-size: 2.96285714em;
}

.katex .sizing.reset-size3.size11,
.katex .fontsize-ensurer.reset-size3.size11 {
  font-size: 3.55428571em;
}

.katex .sizing.reset-size4.size1,
.katex .fontsize-ensurer.reset-size4.size1 {
  font-size: 0.625em;
}

.katex .sizing.reset-size4.size2,
.katex .fontsize-ensurer.reset-size4.size2 {
  font-size: 0.75em;
}

.katex .sizing.reset-size4.size3,
.katex .fontsize-ensurer.reset-size4.size3 {
  font-size: 0.875em;
}

.katex .sizing.reset-size4.size4,
.katex .fontsize-ensurer.reset-size4.size4 {
  font-size: 1em;
}

.katex .sizing.reset-size4.size5,
.katex .fontsize-ensurer.reset-size4.size5 {
  font-size: 1.125em;
}

.katex .sizing.reset-size4.size6,
.katex .fontsize-ensurer.reset-size4.size6 {
  font-size: 1.25em;
}

.katex .sizing.reset-size4.size7,
.katex .fontsize-ensurer.reset-size4.size7 {
  font-size: 1.5em;
}

.katex .sizing.reset-size4.size8,
.katex .fontsize-ensurer.reset-size4.size8 {
  font-size: 1.8em;
}

.katex .sizing.reset-size4.size9,
.katex .fontsize-ensurer.reset-size4.size9 {
  font-size: 2.16em;
}

.katex .sizing.reset-size4.size10,
.katex .fontsize-ensurer.reset-size4.size10 {
  font-size: 2.5925em;
}

.katex .sizing.reset-size4.size11,
.katex .fontsize-ensurer.reset-size4.size11 {
  font-size: 3.11em;
}

.katex .sizing.reset-size5.size1,
.katex .fontsize-ensurer.reset-size5.size1 {
  font-size: 0.55555556em;
}

.katex .sizing.reset-size5.size2,
.katex .fontsize-ensurer.reset-size5.size2 {
  font-size: 0.66666667em;
}

.katex .sizing.reset-size5.size3,
.katex .fontsize-ensurer.reset-size5.size3 {
  font-size: 0.77777778em;
}

.katex .sizing.reset-size5.size4,
.katex .fontsize-ensurer.reset-size5.size4 {
  font-size: 0.88888889em;
}

.katex .sizing.reset-size5.size5,
.katex .fontsize-ensurer.reset-size5.size5 {
  font-size: 1em;
}

.katex .sizing.reset-size5.size6,
.katex .fontsize-ensurer.reset-size5.size6 {
  font-size: 1.11111111em;
}

.katex .sizing.reset-size5.size7,
.katex .fontsize-ensurer.reset-size5.size7 {
  font-size: 1.33333333em;
}

.katex .sizing.reset-size5.size8,
.katex .fontsize-ensurer.reset-size5.size8 {
  font-size: 1.6em;
}

.katex .sizing.reset-size5.size9,
.katex .fontsize-ensurer.reset-size5.size9 {
  font-size: 1.92em;
}

.katex .sizing.reset-size5.size10,
.katex .fontsize-ensurer.reset-size5.size10 {
  font-size: 2.30444444em;
}

.katex .sizing.reset-size5.size11,
.katex .fontsize-ensurer.reset-size5.size11 {
  font-size: 2.76444444em;
}

.katex .sizing.reset-size6.size1,
.katex .fontsize-ensurer.reset-size6.size1 {
  font-size: 0.5em;
}

.katex .sizing.reset-size6.size2,
.katex .fontsize-ensurer.reset-size6.size2 {
  font-size: 0.6em;
}

.katex .sizing.reset-size6.size3,
.katex .fontsize-ensurer.reset-size6.size3 {
  font-size: 0.7em;
}

.katex .sizing.reset-size6.size4,
.katex .fontsize-ensurer.reset-size6.size4 {
  font-size: 0.8em;
}

.katex .sizing.reset-size6.size5,
.katex .fontsize-ensurer.reset-size6.size5 {
  font-size: 0.9em;
}

.katex .sizing.reset-size6.size6,
.katex .fontsize-ensurer.reset-size6.size6 {
  font-size: 1em;
}

.katex .sizing.reset-size6.size7,
.katex .fontsize-ensurer.reset-size6.size7 {
  font-size: 1.2em;
}

.katex .sizing.reset-size6.size8,
.katex .fontsize-ensurer.reset-size6.size8 {
  font-size: 1.44em;
}

.katex .sizing.reset-size6.size9,
.katex .fontsize-ensurer.reset-size6.size9 {
  font-size: 1.728em;
}

.katex .sizing.reset-size6.size10,
.katex .fontsize-ensurer.reset-size6.size10 {
  font-size: 2.074em;
}

.katex .sizing.reset-size6.size11,
.katex .fontsize-ensurer.reset-size6.size11 {
  font-size: 2.488em;
}

.katex .sizing.reset-size7.size1,
.katex .fontsize-ensurer.reset-size7.size1 {
  font-size: 0.41666667em;
}

.katex .sizing.reset-size7.size2,
.katex .fontsize-ensurer.reset-size7.size2 {
  font-size: 0.5em;
}

.katex .sizing.reset-size7.size3,
.katex .fontsize-ensurer.reset-size7.size3 {
  font-size: 0.58333333em;
}

.katex .sizing.reset-size7.size4,
.katex .fontsize-ensurer.reset-size7.size4 {
  font-size: 0.66666667em;
}

.katex .sizing.reset-size7.size5,
.katex .fontsize-ensurer.reset-size7.size5 {
  font-size: 0.75em;
}

.katex .sizing.reset-size7.size6,
.katex .fontsize-ensurer.reset-size7.size6 {
  font-size: 0.83333333em;
}

.katex .sizing.reset-size7.size7,
.katex .fontsize-ensurer.reset-size7.size7 {
  font-size: 1em;
}

.katex .sizing.reset-size7.size8,
.katex .fontsize-ensurer.reset-size7.size8 {
  font-size: 1.2em;
}

.katex .sizing.reset-size7.size9,
.katex .fontsize-ensurer.reset-size7.size9 {
  font-size: 1.44em;
}

.katex .sizing.reset-size7.size10,
.katex .fontsize-ensurer.reset-size7.size10 {
  font-size: 1.72833333em;
}

.katex .sizing.reset-size7.size11,
.katex .fontsize-ensurer.reset-size7.size11 {
  font-size: 2.07333333em;
}

.katex .sizing.reset-size8.size1,
.katex .fontsize-ensurer.reset-size8.size1 {
  font-size: 0.34722222em;
}

.katex .sizing.reset-size8.size2,
.katex .fontsize-ensurer.reset-size8.size2 {
  font-size: 0.41666667em;
}

.katex .sizing.reset-size8.size3,
.katex .fontsize-ensurer.reset-size8.size3 {
  font-size: 0.48611111em;
}

.katex .sizing.reset-size8.size4,
.katex .fontsize-ensurer.reset-size8.size4 {
  font-size: 0.55555556em;
}

.katex .sizing.reset-size8.size5,
.katex .fontsize-ensurer.reset-size8.size5 {
  font-size: 0.625em;
}

.katex .sizing.reset-size8.size6,
.katex .fontsize-ensurer.reset-size8.size6 {
  font-size: 0.69444444em;
}

.katex .sizing.reset-size8.size7,
.katex .fontsize-ensurer.reset-size8.size7 {
  font-size: 0.83333333em;
}

.katex .sizing.reset-size8.size8,
.katex .fontsize-ensurer.reset-size8.size8 {
  font-size: 1em;
}

.katex .sizing.reset-size8.size9,
.katex .fontsize-ensurer.reset-size8.size9 {
  font-size: 1.2em;
}

.katex .sizing.reset-size8.size10,
.katex .fontsize-ensurer.reset-size8.size10 {
  font-size: 1.44027778em;
}

.katex .sizing.reset-size8.size11,
.katex .fontsize-ensurer.reset-size8.size11 {
  font-size: 1.72777778em;
}

.katex .sizing.reset-size9.size1,
.katex .fontsize-ensurer.reset-size9.size1 {
  font-size: 0.28935185em;
}

.katex .sizing.reset-size9.size2,
.katex .fontsize-ensurer.reset-size9.size2 {
  font-size: 0.34722222em;
}

.katex .sizing.reset-size9.size3,
.katex .fontsize-ensurer.reset-size9.size3 {
  font-size: 0.40509259em;
}

.katex .sizing.reset-size9.size4,
.katex .fontsize-ensurer.reset-size9.size4 {
  font-size: 0.46296296em;
}

.katex .sizing.reset-size9.size5,
.katex .fontsize-ensurer.reset-size9.size5 {
  font-size: 0.52083333em;
}

.katex .sizing.reset-size9.size6,
.katex .fontsize-ensurer.reset-size9.size6 {
  font-size: 0.5787037em;
}

.katex .sizing.reset-size9.size7,
.katex .fontsize-ensurer.reset-size9.size7 {
  font-size: 0.69444444em;
}

.katex .sizing.reset-size9.size8,
.katex .fontsize-ensurer.reset-size9.size8 {
  font-size: 0.83333333em;
}

.katex .sizing.reset-size9.size9,
.katex .fontsize-ensurer.reset-size9.size9 {
  font-size: 1em;
}

.katex .sizing.reset-size9.size10,
.katex .fontsize-ensurer.reset-size9.size10 {
  font-size: 1.20023148em;
}

.katex .sizing.reset-size9.size11,
.katex .fontsize-ensurer.reset-size9.size11 {
  font-size: 1.43981481em;
}

.katex .sizing.reset-size10.size1,
.katex .fontsize-ensurer.reset-size10.size1 {
  font-size: 0.24108004em;
}

.katex .sizing.reset-size10.size2,
.katex .fontsize-ensurer.reset-size10.size2 {
  font-size: 0.28929605em;
}

.katex .sizing.reset-size10.size3,
.katex .fontsize-ensurer.reset-size10.size3 {
  font-size: 0.33751205em;
}

.katex .sizing.reset-size10.size4,
.katex .fontsize-ensurer.reset-size10.size4 {
  font-size: 0.38572806em;
}

.katex .sizing.reset-size10.size5,
.katex .fontsize-ensurer.reset-size10.size5 {
  font-size: 0.43394407em;
}

.katex .sizing.reset-size10.size6,
.katex .fontsize-ensurer.reset-size10.size6 {
  font-size: 0.48216008em;
}

.katex .sizing.reset-size10.size7,
.katex .fontsize-ensurer.reset-size10.size7 {
  font-size: 0.57859209em;
}

.katex .sizing.reset-size10.size8,
.katex .fontsize-ensurer.reset-size10.size8 {
  font-size: 0.69431051em;
}

.katex .sizing.reset-size10.size9,
.katex .fontsize-ensurer.reset-size10.size9 {
  font-size: 0.83317261em;
}

.katex .sizing.reset-size10.size10,
.katex .fontsize-ensurer.reset-size10.size10 {
  font-size: 1em;
}

.katex .sizing.reset-size10.size11,
.katex .fontsize-ensurer.reset-size10.size11 {
  font-size: 1.19961427em;
}

.katex .sizing.reset-size11.size1,
.katex .fontsize-ensurer.reset-size11.size1 {
  font-size: 0.20096463em;
}

.katex .sizing.reset-size11.size2,
.katex .fontsize-ensurer.reset-size11.size2 {
  font-size: 0.24115756em;
}

.katex .sizing.reset-size11.size3,
.katex .fontsize-ensurer.reset-size11.size3 {
  font-size: 0.28135048em;
}

.katex .sizing.reset-size11.size4,
.katex .fontsize-ensurer.reset-size11.size4 {
  font-size: 0.32154341em;
}

.katex .sizing.reset-size11.size5,
.katex .fontsize-ensurer.reset-size11.size5 {
  font-size: 0.36173633em;
}

.katex .sizing.reset-size11.size6,
.katex .fontsize-ensurer.reset-size11.size6 {
  font-size: 0.40192926em;
}

.katex .sizing.reset-size11.size7,
.katex .fontsize-ensurer.reset-size11.size7 {
  font-size: 0.48231511em;
}

.katex .sizing.reset-size11.size8,
.katex .fontsize-ensurer.reset-size11.size8 {
  font-size: 0.57877814em;
}

.katex .sizing.reset-size11.size9,
.katex .fontsize-ensurer.reset-size11.size9 {
  font-size: 0.69453376em;
}

.katex .sizing.reset-size11.size10,
.katex .fontsize-ensurer.reset-size11.size10 {
  font-size: 0.83360129em;
}

.katex .sizing.reset-size11.size11,
.katex .fontsize-ensurer.reset-size11.size11 {
  font-size: 1em;
}

.katex .delimsizing.size1 {
  font-family: KaTeX_Size1;
}

.katex .delimsizing.size2 {
  font-family: KaTeX_Size2;
}

.katex .delimsizing.size3 {
  font-family: KaTeX_Size3;
}

.katex .delimsizing.size4 {
  font-family: KaTeX_Size4;
}

.katex .delimsizing.mult .delim-size1 > span {
  font-family: KaTeX_Size1;
}

.katex .delimsizing.mult .delim-size4 > span {
  font-family: KaTeX_Size4;
}

.katex .nulldelimiter {
  display: inline-block;
  width: 0.12em;
}

.katex .delimcenter {
  position: relative;
}

.katex .op-symbol {
  position: relative;
}

.katex .op-symbol.small-op {
  font-family: KaTeX_Size1;
}

.katex .op-symbol.large-op {
  font-family: KaTeX_Size2;
}

.katex .op-limits > .vlist-t {
  text-align: center;
}

.katex .accent > .vlist-t {
  text-align: center;
}

.katex .accent .accent-body {
  width: 0;
  position: relative;
}

.katex .overlay {
  display: block;
}

.katex .mtable .vertical-separator {
  display: inline-block;
  margin: 0 -0.125em;
  width: 0.25em;
}

.katex .mtable .arraycolsep {
  display: inline-block;
}

.katex .mtable .col-align-c > .vlist-t {
  text-align: center;
}

.katex .mtable .col-align-l > .vlist-t {
  text-align: left;
}

.katex .mtable .col-align-r > .vlist-t {
  text-align: right;
}

.katex .svg-align {
  text-align: left;
}

.katex svg {
  display: block;
  position: absolute;
  width: 100%;
  fill: currentColor;
  stroke: currentColor;
  fill-rule: nonzero;
  fill-opacity: 1;
  stroke-width: 1;
  stroke-linecap: butt;
  stroke-linejoin: miter;
  stroke-miterlimit: 4;
  stroke-dasharray: none;
  stroke-dashoffset: 0;
  stroke-opacity: 1;
}

.katex svg path {
  stroke: none;
}

.katex .vertical-separator svg {
  width: 0.25em;
}

.katex .stretchy {
  width: 100%;
  display: block;
}

.katex .stretchy:before,
.katex .stretchy:after {
  content: "";
}

.katex .hide-tail {
  width: 100%;
  position: relative;
  overflow: hidden;
}

.katex .halfarrow-left {
  position: absolute;
  left: 0;
  width: 50.1%;
  overflow: hidden;
}

.katex .halfarrow-right {
  position: absolute;
  right: 0;
  width: 50%;
  overflow: hidden;
}

.katex .brace-left {
  position: absolute;
  left: 0;
  width: 25.1%;
  overflow: hidden;
}

.katex .brace-center {
  position: absolute;
  left: 25%;
  width: 50%;
  overflow: hidden;
}

.katex .brace-right {
  position: absolute;
  right: 0;
  width: 25.1%;
  overflow: hidden;
}

.katex .x-arrow-pad {
  padding: 0 0.5em;
}

.katex .x-arrow,
.katex .mover,
.katex .munder {
  text-align: center;
}

.katex .boxpad {
  padding: 0 0.3em 0 0.3em;
}

.katex .fbox {
  box-sizing: border-box;
  border: 0.04em solid black;
}

.katex .fcolorbox {
  box-sizing: border-box;
  border: 0.04em solid;
}

.katex .cancel-pad {
  padding: 0 0.2em 0 0.2em;
}

.katex .mord + .cancel-lap,
.katex .mbin + .cancel-lap {
  margin-left: -0.2em;
}

.katex .cancel-lap + .mord,
.katex .cancel-lap + .mbin,
.katex .cancel-lap + .msupsub {
  margin-left: -0.2em;
}

.katex .sout {
  border-bottom-style: solid;
  border-bottom-width: 0.08em;
}</style><style type="text/css">
#free-reward-panel .reward-users-modal main {
  padding: 0;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.reward-note-modal .v-modal {
  width: 620px;
  text-align: center;
}
.reward-note-modal .v-modal form {
    margin: 0 auto 25px auto;
    padding: 0 40px;
}
.reward-note-modal .v-modal .reward-intro {
    margin-top: 20px;
    margin-bottom: 20px;
    font-size: 16px;
}
.reward-note-modal .v-modal .reward-intro .avatar {
      cursor: default !important;
      width: 36px;
      height: 36px;
      margin-right: 10px;
      display: inline-block;
}
.reward-note-modal .v-modal .reward-intro .intro {
      margin-right: 5px;
      font-weight: bold;
      vertical-align: middle;
}
.reward-note-modal .v-modal .reward-intro i {
      color: #EA6F5A;
      vertical-align: middle;
}
.reward-note-modal .v-modal .main-inputs {
    margin: 25px 0;
}
.reward-note-modal .v-modal .main-inputs .amount-group {
      margin: 0 -5px;
}
.reward-note-modal .v-modal .main-inputs .amount-group input {
        display: none;
}
.reward-note-modal .v-modal .main-inputs .amount-group input:checked + .option {
        color: #EA6F5A;
        border-color: #EA6F5A;
}
.reward-note-modal .v-modal .main-inputs .amount-group .custom-amount:checked + .option .custom-text {
        opacity: 0;
}
.reward-note-modal .v-modal .main-inputs .amount-group .custom-amount:checked + .option .custom-amount-input {
        opacity: 1;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option {
        position: relative;
        margin: 0 5px 15px;
        width: 156px;
        height: 56px;
        line-height: 54px;
        border: 1px solid #E6E6E6;
        border-radius: 4px;
        font-weight: normal;
        color: #999999;
        cursor: pointer;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option i {
          font-size: 16px;
          vertical-align: middle;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .amount {
          font-size: 28px;
          vertical-align: middle;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .piece {
          font-size: 13px;
          vertical-align: sub;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input {
          position: absolute;
          top: 0;
          z-index: -1;
          width: 100%;
          opacity: 0;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input i {
            position: absolute;
            top: 0;
            left: 10px;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input .piece {
            position: absolute;
            top: 4px;
            right: 10px;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input input {
            display: block;
            margin: 0 auto;
            width: 80px;
            height: 54px;
            line-height: 54px;
            border: none;
            font-size: 28px;
            text-align: center;
            background: transparent;
            -moz-appearance: textfield;
}
.reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input input::-webkit-outer-spin-button, .reward-note-modal .v-modal .main-inputs .amount-group .option .custom-amount-input input::-webkit-inner-spin-button {
              -webkit-appearance: none !important;
}
.reward-note-modal .v-modal .main-inputs .message {
      padding: 15px 20px;
      margin-bottom: 0;
      font-size: 14px;
      border: 1px solid #E6E6E6;
      color: #333333;
      border-radius: 4px;
      background-color: rgba(180, 180, 180, 0.1);
}
.reward-note-modal .v-modal .main-inputs .message textarea {
        width: 100%;
        height: 44px;
        padding: 0;
        margin: 0;
        resize: none;
        background: none !important;
        border: none !important;
        -webkit-box-sizing: border-box;
                box-sizing: border-box;
        -webkit-box-shadow: none;
                box-shadow: none;
}
.reward-note-modal .v-modal .main-inputs .message textarea:focus {
          outline: none;
}
.reward-note-modal .v-modal .reward-info .amount {
    font-size: 28px;
    font-weight: bold;
    color: #EA6F5A;
}
.reward-note-modal .v-modal .reward-info .pay-method {
    font-size: 14px;
}
.reward-note-modal .v-modal .reward-info .pay-method a {
      color: #3194D0;
}
.reward-note-modal .v-modal .choose-pay {
    margin: 0 -5px;
}
.reward-note-modal .v-modal .choose-pay input {
      display: none;
}
.reward-note-modal .v-modal .choose-pay input:checked + .option {
      color: #EA6F5A;
      border-color: #EA6F5A;
}
.reward-note-modal .v-modal .choose-pay .option {
      margin: 20px 5px 10px;
      width: 156px;
      height: 56px;
      line-height: 54px;
      text-align: center;
      border: 1px solid #E6E6E6;
      border-radius: 4px;
      cursor: pointer;
}
.reward-note-modal .v-modal .choose-pay .option img {
        height: 30px;
}
.reward-note-modal .v-modal .choose-pay .option img.day.alipay, .reward-note-modal .v-modal .choose-pay .option img.night.alipay {
        min-width: 85px;
}
.reward-note-modal .v-modal .choose-pay .option img.day.wechat, .reward-note-modal .v-modal .choose-pay .option img.night.wechat {
        min-width: 112px;
}
.reward-note-modal .v-modal .choose-pay .option img.night {
        display: none;
}
.reward-note-modal .v-modal .choose-pay .tooltip {
      width: 230px;
}
.reward-note-modal .v-modal .modal-footer {
    padding: 0 15px 20px;
    border: none;
    background-color: transparent;
    text-align: center;
}
.reward-note-modal .v-modal .modal-footer .btn {
      padding: 8px 45px;
      font-size: 24px;
}
.reward-note-modal .v-modal .btn-pay {
    padding: 8px 25px;
    font-size: 16px;
    color: #ffffff;
    background-color: #F5A623;
}
.weixin-pay, .success-pay {
  text-align: center;
}
.weixin-pay .v-modal, .success-pay .v-modal {
    width: 350px;
}
.weixin-pay .ic-successed, .success-pay .ic-successed {
    font-size: 60px;
    color: #3db922;
}
.weixin-pay h2, .weixin-pay h3, .success-pay h2, .success-pay h3 {
    margin-bottom: 20px;
    color: #333333;
}
.weixin-pay h2, .success-pay h2 {
    margin: 0 0 40px 0;
    font-size: 24px;
}
.weixin-pay .bind-text, .success-pay .bind-text {
    position: relative;
    margin-bottom: 30px;
    font-size: 14px;
    color: #999999;
}
.weixin-pay .bind-text:before, .weixin-pay .bind-text:after, .success-pay .bind-text:before, .success-pay .bind-text:after {
      content: "";
      border-top: 1px solid #999;
      display: block;
      position: absolute;
      width: 40px;
      top: 8px;
}
.weixin-pay .bind-text:before, .success-pay .bind-text:before {
      left: 30px;
}
.weixin-pay .bind-text:after, .success-pay .bind-text:after {
      right: 30px;
}
.weixin-pay .share-bind, .success-pay .share-bind {
    display: block;
    margin-bottom: 30px;
}
.weixin-pay .share-bind i, .success-pay .share-bind i {
      margin-right: 4px;
      font-size: 22px;
      vertical-align: middle;
}
.weixin-pay .share-bind.wechat i, .success-pay .share-bind.wechat i {
      color: #00BB29;
}
.weixin-pay .share-bind.weibo i, .success-pay .share-bind.weibo i {
      color: #E05244;
}
.weixin-pay .wx-qr-code, .success-pay .wx-qr-code {
    display: inline-block;
}
.weixin-pay .wx-qr-code img, .success-pay .wx-qr-code img {
      margin: 0 auto;
      padding: 10px;
      width: 200px;
      background-color: #ffffff;
}
.weixin-pay .pay-amount, .success-pay .pay-amount {
    margin: 20px 0;
    color: #787878;
}
.weixin-pay .pay-amount span, .success-pay .pay-amount span {
      color: #F5A623;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.v-modal-wrap {
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 9999;
  background-color: transparent;
}
.v-modal-wrap.modal-leave-active {
    -webkit-transition: opacity 0.3s;
    -o-transition: opacity 0.3s;
    transition: opacity 0.3s;
}
.v-modal-wrap.modal-enter-active .v-modal-mask, .v-modal-wrap.modal-leave-active .v-modal-mask {
    opacity: 0;
}
.v-modal-wrap.modal-enter-active .v-modal, .v-modal-wrap.modal-leave-active .v-modal {
    -webkit-transform: translate(-50%, -70%);
        -ms-transform: translate(-50%, -70%);
            transform: translate(-50%, -70%);
    opacity: 0;
}
.v-modal-wrap .v-modal-mask {
    background-color: rgba(255, 255, 255, 0.7);
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    -webkit-transition: opacity 0.3s;
    -o-transition: opacity 0.3s;
    transition: opacity 0.3s;
    opacity: 1;
}
.v-modal-wrap .v-modal {
    position: absolute;
    left: 50%;
    top: 50%;
    -webkit-transform: translate(-50%, -50%);
        -ms-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
    border-radius: 6px;
    border: 1px solid rgba(0, 0, 0, 0.1);
    background-color: #fff;
    -webkit-box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1);
            box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1);
    -webkit-transition: opacity 0.3s, -webkit-transform 0.3s;
    transition: opacity 0.3s, -webkit-transform 0.3s;
    -o-transition: opacity 0.3s, transform 0.3s;
    transition: opacity 0.3s, transform 0.3s;
    transition: opacity 0.3s, transform 0.3s, -webkit-transform 0.3s;
    opacity: 1;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -webkit-flex-direction: column;
        -ms-flex-direction: column;
            flex-direction: column;
    overflow: hidden;
}
.v-modal-wrap .v-modal > header:before, .v-modal-wrap .v-modal > header:after, .v-modal-wrap .v-modal > main:before, .v-modal-wrap .v-modal > main:after, .v-modal-wrap .v-modal > footer:before, .v-modal-wrap .v-modal > footer:after {
      content: '';
      clear: both;
      display: table;
}
.v-modal-wrap .v-modal > header {
      padding: 20px;
      border-bottom: 1px solid #F0F0F0;
}
.v-modal-wrap .v-modal > header h4 {
        margin: 0;
        color: #333;
        text-align: left;
}
.v-modal-wrap .v-modal .close {
      position: absolute;
      right: 16px;
      top: 20px;
      font-size: 26px;
      line-height: 20px;
      color: rgba(0, 0, 0, 0.8);
}
.v-modal-wrap .v-modal .close:hover {
        color: #000000;
}
.v-modal-wrap .v-modal > main {
      padding: 20px 20px 20px 20px;
      font-size: 15px;
      color: #333;
      -webkit-box-flex: 1;
      -webkit-flex-grow: 1;
          -ms-flex-positive: 1;
              flex-grow: 1;
      overflow-x: hidden;
      overflow-y: auto;
}
.v-modal-wrap .v-modal > footer {
      padding: 20px;
      background-color: #fff;
}
.v-modal-wrap .v-modal > footer button {
        padding: 0;
        margin: 0;
        background-color: transparent;
        border: 0;
        float: right;
}
.v-modal-wrap .v-modal > footer button:focus {
          outline: 0;
}
.v-modal-wrap .v-modal > footer .submit {
        padding: 4px 12px;
        border: 1px solid;
        border-radius: 20px;
}
.v-modal-wrap .v-modal > footer .cancel {
        margin-top: 5px;
}
.v-modal-wrap .v-modal > footer .cancel:hover {
          color: #333333;
}
.reader-night-mode .v-modal-wrap .v-modal-mask {
  background-color: rgba(63, 63, 63, 0.7);
}
.reader-night-mode .v-modal-wrap .v-modal {
  background-color: #3f3f3f;
}
.reader-night-mode .v-modal-wrap .v-modal header {
    border-color: #2F2F2F;
}
.reader-night-mode .v-modal-wrap .v-modal header h4 {
      color: #C8C8C8;
}
.reader-night-mode .v-modal-wrap .v-modal .close {
    color: #C8C8C8;
}
.reader-night-mode .v-modal-wrap .v-modal .close:hover {
      color: #ffffff;
}
.reader-night-mode .v-modal-wrap .v-modal main {
    color: #C8C8C8;
}
.reader-night-mode .v-modal-wrap .v-modal footer {
    background-color: #3f3f3f;
}
.reader-night-mode .v-modal-wrap .v-modal footer .cancel:hover {
      color: #C8C8C8;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.like[data-v-6ddd02c6] {
  display: inline-block;
}
.like .like-group[data-v-6ddd02c6] {
    position: relative;
    padding: 13px 0 15px 0;
    font-size: 0;
    border: 1px solid #EA6F5A;
    border-radius: 40px;
}
.like .like-group[data-v-6ddd02c6]:hover {
      background-color: rgba(236, 97, 73, 0.05);
}
.like .like-group .btn-like[data-v-6ddd02c6] {
      display: inline-block;
      font-size: 19px;
}
.like .like-group .btn-like[data-v-6ddd02c6]:before {
        content: '';
        position: absolute;
        left: 12px;
        top: 2px;
        width: 50px;
        height: 50px;
        background-image: url(//cdn2.jianshu.io/assets/web/like_animation_steps-62a00a7b52377d3069927cdb8e61fd34.png);
        background-position: left;
        background-repeat: no-repeat;
        background-size: 1000px 50px;
}
.like .like-group .btn-like a[data-v-6ddd02c6] {
        position: relative;
        padding: 18px 30px 18px 55px;
        color: #EA6F5A;
}
.like .like-group .modal-wrap[data-v-6ddd02c6] {
      font-size: 18px;
      border-left: 1px solid rgba(236, 97, 73, 0.4);
      display: inline-block;
      margin-left: -15px;
}
.like .like-group .modal-wrap a[data-v-6ddd02c6] {
        color: #EA6F5A;
        padding: 18px 26px 18px 18px;
}
.like .like-group.like-animation[data-v-6ddd02c6], .like .like-group.active[data-v-6ddd02c6] {
      background-color: #EA6F5A;
}
.like .like-group.like-animation .btn-like a[data-v-6ddd02c6], .like .like-group.active .btn-like a[data-v-6ddd02c6] {
        color: white;
}
.like .like-group.like-animation .modal-wrap[data-v-6ddd02c6], .like .like-group.active .modal-wrap[data-v-6ddd02c6] {
        border-left: 1px solid white;
}
.like .like-group.like-animation .modal-wrap a[data-v-6ddd02c6], .like .like-group.active .modal-wrap a[data-v-6ddd02c6] {
          color: white;
}
.like .like-group.like-animation .btn-like[data-v-6ddd02c6]:before {
      -webkit-animation: likeBlast-data-v-6ddd02c6 0.6s 1 steps(19);
              animation: likeBlast-data-v-6ddd02c6 0.6s 1 steps(19);
      background-position: right;
}
@-webkit-keyframes likeBlast {
0% {
    background-position: left;
}
100% {
    background-position: right;
}
}
@keyframes likeBlast-data-v-6ddd02c6 {
0% {
    background-position: left;
}
100% {
    background-position: right;
}
}
.like .like-group.active .btn-like[data-v-6ddd02c6]:before {
      background-position: right;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.main {
  position: relative;
  margin: 0 auto;
  padding: 0 0 30px 0;
  width: 620px;
}
.main .title {
    padding-left: 8px;
    border-left: 3px solid #EA6F5A;
    line-height: 1;
    font-size: 15px;
}
.main .collection-settings {
    position: absolute;
    top: 2px;
    right: 0;
    font-size: 13px;
    color: #A0A0A0;
}
.main .collection-settings span {
      padding-left: 4px;
}
.main .include-collection {
    width: 100%;
    padding-top: 20px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: start;
    -webkit-justify-content: flex-start;
        -ms-flex-pack: start;
            justify-content: flex-start;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    -webkit-flex-wrap: wrap;
        -ms-flex-wrap: wrap;
            flex-wrap: wrap;
}
.main .include-collection .item {
      display: inline-block;
      margin: 0 12px 12px 0;
      min-height: 32px;
      background-color: white;
      border: 1px solid #DCDCDC;
      border-radius: 4px;
      vertical-align: top;
      overflow: hidden;
}
.main .include-collection .item img {
        width: 32px;
        height: 32px;
}
.main .include-collection .item .name {
        display: inline-block;
        padding: 0 10px;
        font-size: 14px;
}
.main .include-collection .add-collection-wrap {
      margin: 0 12px 12px 0;
}
.main .include-collection .add-collection {
      padding: 8px 12px;
      font-size: 14px;
      border: 1px solid #DCDCDC;
      border-radius: 4px;
}
.main .include-collection .add-collection i {
        margin-right: 4px;
        color: #969696;
}
.main .recommend-note a {
    position: relative;
    margin: 20px 2px 0 0;
    width: 200px;
    height: 160px;
    display: inline-block;
}
.main .recommend-note a:after {
      content: "";
      position: absolute;
      width: 200px;
      height: 160px;
      border-radius: 0 0 4px 4px;
      -webkit-box-shadow: inset 0px -80px 50px -22px rgba(0, 0, 0, 0.6);
              box-shadow: inset 0px -80px 50px -22px rgba(0, 0, 0, 0.6);
      top: 0;
      left: 0;
      z-index: 1;
}
.main .recommend-note .name {
    position: absolute;
    bottom: 40px;
    left: 10px;
    right: 10px;
    font-size: 17px;
    font-weight: bold;
    color: #ffffff;
    z-index: 2;
}
.main .recommend-note .author {
    position: absolute;
    bottom: 10px;
    left: 10px;
    right: 10px;
    z-index: 2;
}
.main .recommend-note .avatar {
    width: 20px;
    height: 20px;
    display: inline-block;
}
.main .recommend-note .avatar img {
      border-radius: 50%;
}
.main .recommend-note .author-name {
    font-size: 12px;
    color: #ffffff;
    display: inline-block;
    vertical-align: -1px;
}
.main .show-more {
    margin: 0 12px 12px 0;
    font-size: 14px;
    color: #A0A0A0;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.recommend-note {
  margin-bottom: 20px;
}
.recommend-note .meta, .recommend-note .list {
    width: 620px;
    margin: 0 auto;
}
.recommend-note .meta .title {
    padding-left: 8px;
    border-left: 3px solid #EA6F5A;
    line-height: 1;
    font-size: 15px;
}
.recommend-note .meta .title .more {
      float: right;
      font-size: 14px;
      color: #A0A0A0;
}
.recommend-note .list {
    margin-top: 20px;
}
.recommend-note .list .note {
      display: block;
      margin-bottom: 25px;
      padding: 0 0 25px 0;
      border-bottom: 1px solid #DDDDDD;
}
.recommend-note .list .note.have-img {
        min-height: 136px;
}
.recommend-note .list .note .cover {
        float: right;
        margin: -5px 0 0 15px;
        width: 150px;
        height: 120px;
        background-position: center;
        background-repeat: no-repeat;
        background-size: cover;
        border-radius: 6px;
}
.recommend-note .list .note .title {
        display: inherit;
        margin-bottom: 4px;
        font-size: 18px;
        line-height: 27px;
        font-weight: bold;
        color: #333333;
        overflow: hidden;
        -o-text-overflow: ellipsis;
           text-overflow: ellipsis;
        white-space: nowrap;
}
.recommend-note .list .note .title:hover {
          text-decoration: underline;
}
.recommend-note .list .note .title:visited {
          color: #999999;
}
.recommend-note .list .note .description {
        margin-bottom: 12px;
        font-size: 13px;
        line-height: 23px;
        color: #333333;
        overflow: hidden;
        -o-text-overflow: ellipsis;
           text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
}
.recommend-note .list .note .author .avatar {
        display: inline-block;
        width: 24px;
        height: 24px;
        margin-right: 3px;
        border-radius: 50%;
        background-position: center;
        background-repeat: no-repeat;
        background-size: cover;
        vertical-align: middle;
}
.recommend-note .list .note .author .name {
        font-size: 13px;
        color: #333333;
        vertical-align: middle;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.pc-bind-phone-modal .modal-content, .pc-bind-phone-modal .modal-body {
  overflow: visible;
}
.pc-bind-phone-modal .dropdown-menu {
  max-height: 300px;
  overflow: auto;
}
.pc-bind-phone-modal .dropdown-menu .tag {
    background-color: #efefef;
    color: #4A4A4A;
    height: 28px;
    line-height: 28px;
    padding-left: 25px;
    font-size: 12px;
}
.reader-night-mode .pc-bind-phone-modal .dropdown-menu .tag {
  background-color: #2F2F2F;
  color: #999999;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.tips-card-loading[data-v-f3bf5228], .tips-card[data-v-f3bf5228] {
  width: 460px;
  position: relative;
  left: 0;
  top: 0;
  border-radius: 6px;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  background-color: #ffffff;
  -webkit-box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1);
          box-shadow: 0 5px 25px rgba(0, 0, 0, 0.1);
  border: 1px solid #d9d9d9;
}
.tips-card-loading[data-v-f3bf5228] {
  height: 200px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -webkit-flex-direction: row;
      -ms-flex-direction: row;
          flex-direction: row;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  position: relative;
}
.tips-card-loading div[data-v-f3bf5228] {
    background-color: #EAEAEA;
}
.tips-card-loading .avatar[data-v-f3bf5228] {
    width: 72px !important;
    height: 72px !important;
    border-radius: 50%;
    position: absolute;
    left: 20px;
    top: 20px;
}
.tips-card-loading .name[data-v-f3bf5228] {
    width: 120px;
    height: 20px;
    position: absolute;
    left: 110px;
    top: 31px;
}
.tips-card-loading .content[data-v-f3bf5228] {
    position: absolute;
    left: 110px;
    top: 62px;
    width: 238px;
    height: 39.2px;
    background-color: transparent;
}
.tips-card-loading .content .text[data-v-f3bf5228], .tips-card-loading .content .text-delay[data-v-f3bf5228] {
      height: 14px;
      position: absolute;
      left: 0;
      width: 100%;
}
.tips-card-loading .content .text[data-v-f3bf5228] {
      top: 2px;
      -webkit-animation: loading-data-v-f3bf5228 1s ease-in-out infinite;
      animation: loading-data-v-f3bf5228 1s ease-in-out infinite;
}
.tips-card-loading .content .text-delay[data-v-f3bf5228] {
      bottom: 3px;
      -webkit-animation: loading-data-v-f3bf5228 1s ease-in-out -0.5s infinite;
      animation: loading-data-v-f3bf5228 1s ease-in-out -0.5s infinite;
}
@keyframes loading-data-v-f3bf5228 {
0% {
    width: 60%;
}
50% {
    width: 100%;
}
100% {
    width: 60%;
}
}
@-webkit-keyframes loading {
0% {
    width: 60%;
}
50% {
    width: 100%;
}
100% {
    width: 60%;
}
}
.tips-card-loading .meta[data-v-f3bf5228] {
    width: 30px;
    height: 42px;
    position: absolute;
    bottom: 20px;
    background-color: transparent;
}
.tips-card-loading .meta.meta-1[data-v-f3bf5228] {
      left: 30px;
}
.tips-card-loading .meta.meta-2[data-v-f3bf5228] {
      left: 90px;
}
.tips-card-loading .meta.meta-3[data-v-f3bf5228] {
      left: 150px;
}
.tips-card-loading .meta .count[data-v-f3bf5228], .tips-card-loading .meta .type[data-v-f3bf5228] {
      position: absolute;
}
.tips-card-loading .meta .count[data-v-f3bf5228] {
      left: -5px;
      top: 6px;
      height: 18px;
      width: 40px;
}
.tips-card-loading .meta .type[data-v-f3bf5228] {
      left: 1px;
      bottom: 2px;
      height: 13px;
      width: 28px;
}
.tips-card-loading .button[data-v-f3bf5228] {
    position: absolute;
    bottom: 17px;
    width: 90px;
    height: 40px;
    border-radius: 40px;
}
.tips-card-loading .message[data-v-f3bf5228] {
    right: 120px;
}
.tips-card-loading .follow[data-v-f3bf5228] {
    right: 17px;
}
.tips-card[data-v-f3bf5228] {
  z-index: 10;
}
.tips-card .card-content[data-v-f3bf5228] {
    padding: 20px 20px 0 20px;
}
.tips-card .card-content .summary[data-v-f3bf5228] {
      padding: 8px 0 20px 90px;
      min-height: 92px;
      position: relative;
}
.tips-card .card-content .summary .avatar[data-v-f3bf5228] {
        position: absolute;
        left: 0;
        top: 0;
        width: 72px;
        height: 72px;
        cursor: pointer;
        border-radius: 50%;
        background-color: #EAEAEA;
        background-position: center;
        background-repeat: no-repeat;
        background-size: cover;
}
.tips-card .card-content .summary .name[data-v-f3bf5228] {
        height: 26px;
        margin-right: 3px;
        margin-bottom: 8px;
        display: -webkit-box;
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex;
        -webkit-box-orient: horizontal;
        -webkit-box-direction: normal;
        -webkit-flex-direction: row;
            -ms-flex-direction: row;
                flex-direction: row;
        -webkit-box-pack: start;
        -webkit-justify-content: flex-start;
            -ms-flex-pack: start;
                justify-content: flex-start;
        -webkit-box-align: center;
        -webkit-align-items: center;
            -ms-flex-align: center;
                align-items: center;
}
.tips-card .card-content .summary .name .nickname[data-v-f3bf5228] {
          color: #333333;
          font-size: 19px;
          font-weight: bold;
          overflow: hidden;
          -o-text-overflow: ellipsis;
             text-overflow: ellipsis;
          white-space: nowrap;
          cursor: pointer;
}
.tips-card .card-content .summary .name .sex[data-v-f3bf5228], .tips-card .card-content .summary .name .badge[data-v-f3bf5228] {
          -webkit-flex-shrink: 0;
              -ms-flex-negative: 0;
                  flex-shrink: 0;
          display: inline-block;
}
.tips-card .card-content .summary .name .sex[data-v-f3bf5228] {
          font-size: 19px;
          width: 19px;
          margin: 0 4px;
}
.tips-card .card-content .summary .intro[data-v-f3bf5228] {
        overflow: hidden;
        -o-text-overflow: ellipsis;
           text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        margin-bottom: 12px;
        font-size: 14px;
        line-height: 1.5;
        color: #333333;
}
.tips-card .card-content .summary .intro.block[data-v-f3bf5228] {
          color: #999999;
}
.tips-card .card-content .summary .list .item[data-v-f3bf5228] {
        display: block;
        margin-bottom: 5px;
        font-size: 13px;
        color: #999999;
        cursor: pointer;
        overflow: hidden;
        -o-text-overflow: ellipsis;
           text-overflow: ellipsis;
        white-space: nowrap;
}
.tips-card .card-content .summary .list .item i[data-v-f3bf5228] {
          margin-right: 2px;
}
.tips-card .card-footer[data-v-f3bf5228] {
    border-top: 1px solid #F0F0F0;
    padding: 15px;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-orient: horizontal;
    -webkit-box-direction: normal;
    -webkit-flex-direction: row;
        -ms-flex-direction: row;
            flex-direction: row;
    -webkit-box-pack: justify;
    -webkit-justify-content: space-between;
        -ms-flex-pack: justify;
            justify-content: space-between;
    -webkit-box-align: center;
    -webkit-align-items: center;
        -ms-flex-align: center;
            align-items: center;
    overflow: hidden;
    _zoom: 1;
}
.tips-card .card-footer .profile[data-v-f3bf5228] {
      width: 198px;
      overflow: hidden;
      _zoom: 1;
      float: left;
}
.tips-card .card-footer .profile div[data-v-f3bf5228] {
        float: left;
        width: 60px;
        height: 44px;
        display: -webkit-box;
        display: -webkit-flex;
        display: -ms-flexbox;
        display: flex;
        -webkit-box-orient: vertical;
        -webkit-box-direction: normal;
        -webkit-flex-direction: column;
            -ms-flex-direction: column;
                flex-direction: column;
        -webkit-box-pack: center;
        -webkit-justify-content: center;
            -ms-flex-pack: center;
                justify-content: center;
        -webkit-box-align: center;
        -webkit-align-items: center;
            -ms-flex-align: center;
                align-items: center;
}
.tips-card .card-footer .profile div span[data-v-f3bf5228] {
          display: block;
          width: 100%;
          text-align: center;
}
.tips-card .card-footer .profile div .type[data-v-f3bf5228] {
          font-size: 13px;
          color: #999999;
}
.tips-card .card-footer .profile div .count[data-v-f3bf5228] {
          font-size: 18px;
          color: #333333;
}
.tips-card .card-footer .social[data-v-f3bf5228] {
      display: -webkit-box;
      display: -webkit-flex;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-orient: horizontal;
      -webkit-box-direction: normal;
      -webkit-flex-direction: row;
          -ms-flex-direction: row;
              flex-direction: row;
      -webkit-box-pack: end;
      -webkit-justify-content: flex-end;
          -ms-flex-pack: end;
              justify-content: flex-end;
      -webkit-box-align: center;
      -webkit-align-items: center;
          -ms-flex-align: center;
              align-items: center;
      float: right;
      overflow: hidden;
      _zoom: 1;
}
.tips-card .card-footer .social .message[data-v-f3bf5228] {
        border: 1px solid rgba(59, 194, 29, 0.7);
        color: #42C02E;
        margin: 0 10px 0 16px;
        font-size: 15px;
        padding: 8px 0;
        width: 90px;
        border-radius: 40px;
        text-align: center;
        cursor: pointer;
        float: left;
        -webkit-box-sizing: border-box;
                box-sizing: border-box;
}
.tips-card .card-footer .social .message[data-v-f3bf5228]:hover {
          border: 1px solid #42C02E;
          color: #42C02E;
          background-color: rgba(59, 194, 29, 0.05);
}
.tips-card .card-footer .social .user-follow-button[data-v-f3bf5228] {
        font-size: 15px;
        padding: 8px 0;
        width: 100px;
}
.arrow[data-v-f3bf5228] {
  position: absolute;
  width: 100%;
  height: 10px;
  left: 0;
  z-index: 20;
  pointer-events: none;
}
.arrow i[data-v-f3bf5228] {
    position: absolute;
    left: 50%;
    margin: 0;
    margin-left: -10px;
    border-width: 10px;
    border-color: transparent;
    padding: 0;
}
.arrow em[data-v-f3bf5228] {
    display: block;
    position: absolute;
    left: -9px;
    border-width: 9px;
    border-color: transparent;
    margin: 0;
    padding: 0;
}
.arrow-type-top[data-v-f3bf5228] {
  bottom: 1px;
}
.arrow-type-top i[data-v-f3bf5228] {
    border-top-color: #d9d9d9;
    border-style: solid dashed dashed;
    top: 0;
}
.arrow-type-top em[data-v-f3bf5228] {
    border-style: solid dashed dashed;
    border-top-color: #ffffff;
    top: -10px;
}
.arrow-type-bottom[data-v-f3bf5228] {
  top: 1px;
}
.arrow-type-bottom i[data-v-f3bf5228] {
    border-bottom-color: #d9d9d9;
    border-style: dashed dashed solid;
    top: -10px;
}
.arrow-type-bottom em[data-v-f3bf5228] {
    border-style: dashed dashed solid;
    border-bottom-color: #ffffff;
    top: -8px;
}
.reader-night-mode .tips-card-loading[data-v-f3bf5228] {
  background-color: #3F3F3F;
  border-color: #2F2F2F;
}
.reader-night-mode .tips-card-loading .avatar[data-v-f3bf5228], .reader-night-mode .tips-card-loading .name[data-v-f3bf5228], .reader-night-mode .tips-card-loading .text[data-v-f3bf5228], .reader-night-mode .tips-card-loading .text-delay[data-v-f3bf5228], .reader-night-mode .tips-card-loading .count[data-v-f3bf5228], .reader-night-mode .tips-card-loading .type[data-v-f3bf5228], .reader-night-mode .tips-card-loading .button[data-v-f3bf5228] {
    background-color: #545454;
}
.reader-night-mode .tips-card[data-v-f3bf5228] {
  background-color: #3F3F3F;
  border-color: #2F2F2F;
}
.reader-night-mode .tips-card .card-content .summary .name .nickname[data-v-f3bf5228] {
    color: #C8C8C8;
}
.reader-night-mode .tips-card .card-content .summary .name .nickname[data-v-f3bf5228]:hover {
      color: #ffffff;
}
.reader-night-mode .tips-card .card-content .summary .intro[data-v-f3bf5228] {
    color: #C8C8C8;
}
.reader-night-mode .tips-card .card-footer[data-v-f3bf5228] {
    border-top-color: #2F2F2F;
}
.reader-night-mode .tips-card .card-footer .profile div .count[data-v-f3bf5228] {
      color: #C8C8C8;
}
.reader-night-mode .arrow.arrow-type-top em[data-v-f3bf5228] {
  border-top-color: #3F3F3F;
}
.reader-night-mode .arrow.arrow-type-top i[data-v-f3bf5228] {
  border-top-color: #2F2F2F;
}
.reader-night-mode .arrow.arrow-type-bottom em[data-v-f3bf5228] {
  border-bottom-color: #3F3F3F;
}
.reader-night-mode .arrow.arrow-type-bottom i[data-v-f3bf5228] {
  border-bottom-color: #2F2F2F;
}
</style><style type="text/css">
.v-tooltip-container,
.v-tooltip-content {
  display: inline-block;
}
.v-tooltip-container {
  position: relative;
}
.v-tooltip-container .v-tooltip-content {
    -webkit-user-select: none;
       -moz-user-select: none;
        -ms-user-select: none;
            user-select: none;
}
.v-tooltip-container .v-tooltip-wrap {
    position: absolute;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-top {
      bottom: 100%;
      left: 50%;
      -webkit-transform: translateX(-50%);
          -ms-transform: translateX(-50%);
              transform: translateX(-50%);
      padding-bottom: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-bottom {
      top: 100%;
      left: 50%;
      -webkit-transform: translateX(-50%);
          -ms-transform: translateX(-50%);
              transform: translateX(-50%);
      padding-top: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-left {
      top: 50%;
      right: 100%;
      -webkit-transform: translateY(-50%);
          -ms-transform: translateY(-50%);
              transform: translateY(-50%);
      padding-right: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-right {
      top: 50%;
      left: 100%;
      -webkit-transform: translateY(-50%);
          -ms-transform: translateY(-50%);
              transform: translateY(-50%);
      padding-left: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-top-start {
      bottom: 100%;
      left: 0;
      padding-bottom: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-top-end {
      bottom: 100%;
      right: 0;
      padding-bottom: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-bottom-start {
      top: 100%;
      left: 0;
      padding-top: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-bottom-end {
      top: 100%;
      right: 0;
      padding-top: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-left-start {
      top: 0;
      right: 100%;
      padding-right: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-left-end {
      bottom: 0;
      right: 100%;
      padding-right: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-right-start {
      top: 0;
      left: 100%;
      padding-left: 10px;
}
.v-tooltip-container .v-tooltip-wrap.v-tooltip-wrap-right-end {
      bottom: 0;
      left: 100%;
      padding-left: 10px;
}
</style><style type="text/css">
@charset "UTF-8";
/*
 * 变量
*/
.like-button[data-v-cdecbe24] {
  position: relative;
  padding-left: 23px;
}
.like-button[data-v-cdecbe24]:before {
    content: '';
    position: absolute;
    left: -16px;
    top: -16px;
    width: 50px;
    height: 50px;
    background-image: url(//cdn2.jianshu.io/assets/web/zan_animation_steps-8d65a474b670eb6a022516f4e0b8e9a4.png);
    background-position: left;
    background-repeat: no-repeat;
    background-size: 1050px 50px;
}
.like-button[data-v-cdecbe24]:hover:before {
    background-position: -50px;
}
.like-button.zan-animation span[data-v-cdecbe24], .like-button.active span[data-v-cdecbe24] {
    color: #333333;
}
body.reader-night-mode .like-button.zan-animation span[data-v-cdecbe24], body.reader-night-mode .like-button.active span[data-v-cdecbe24] {
      color: #C8C8C8;
}
.like-button.zan-animation[data-v-cdecbe24]:before {
    -webkit-animation: likeBlast-data-v-cdecbe24 0.6s 1 steps(19);
            animation: likeBlast-data-v-cdecbe24 0.6s 1 steps(19);
    background-position: right;
}
@-webkit-keyframes likeBlast {
0% {
    background-position: -50px;
}
100% {
    background-position: right;
}
}
@keyframes likeBlast-data-v-cdecbe24 {
0% {
    background-position: -50px;
}
100% {
    background-position: right;
}
}
.like-button.active[data-v-cdecbe24]:before {
    background-position: right;
}
</style></head>

  <body lang="zh-CN" class="reader-black-font">
    <!-- 全局顶部导航栏 -->
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
  <div class="width-limit">
    <!-- 左上方 Logo -->
    <a class="logo" href="https://www.jianshu.com/"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/nav-logo-4c7bbafe27adc892f3046e6978459bac.png" alt="Nav logo"></a>

    <!-- 右上角 -->
      <!-- 未登录显示登录/注册/写文章 -->
      <a class="btn write-btn" target="_blank" href="https://www.jianshu.com/writer#/">
        <i class="iconfont ic-write"></i>写文章
</a>      <a class="btn sign-up" href="https://www.jianshu.com/sign_up">注册</a>
      <a class="btn log-in" href="https://www.jianshu.com/sign_in">登录</a>

    <!-- 如果用户登录，显示下拉菜单 -->

    <div class="style-mode"><a class="style-mode-btn"><i class="iconfont ic-navigation-mode"></i></a> <div class="popover-modal" style="left: 0px; display: none;"><div class="meta"><i class="iconfont ic-navigation-night"></i><span>夜间模式</span></div> <div class="switch day-night-group"><a class="switch-btn">开</a> <a class="switch-btn active">关</a></div> <hr> <div class="switch font-family-group"><a class="switch-btn font-song">宋体</a> <a class="switch-btn font-hei active">黑体</a></div> <div class="switch"><a class="switch-btn active">简</a> <a class="switch-btn">繁</a></div></div></div>
    <div class="container">
      <div class="navbar-header">
        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#menu" aria-expanded="false">
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
          <span class="icon-bar"></span>
        </button>
      </div>
      <div class="collapse navbar-collapse" id="menu">
        <ul class="nav navbar-nav">
            <li class="tab ">
              <a href="https://www.jianshu.com/">
                <span class="menu-text">首页</span><i class="iconfont ic-navigation-discover menu-icon"></i>
</a>            </li>
            <li class="tab ">
              <a id="web-nav-app-download-btn" class="app-download-btn" href="https://www.jianshu.com/apps?utm_medium=desktop&amp;utm_source=navbar-apps"><span class="menu-text">下载App</span><i class="iconfont ic-navigation-download menu-icon"></i></a>
            </li>
          <li class="search">
            <form target="_blank" action="https://www.jianshu.com/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓">
              <input type="text" name="q" id="q" value="" autocomplete="off" placeholder="搜索" class="search-input">
              <a class="search-btn" href="javascript:void(null)"><i class="iconfont ic-search"></i></a>
</form>          </li>
        </ul>
      </div>
    </div>
  </div>
</nav>

    
<div class="note">
  <a target="_blank" href="https://www.jianshu.com/apps/download?utm_source=sbc" id="web-note-ad-fixed" style="left: 1139.5px; display: none;"><span class="close">×</span></a>
  <div class="post">
    <div class="article">
        <h1 class="title">基于Docker的Jenkins pipeline工作流.</h1>

        <!-- 作者区域 -->
        <div class="author">
          <a class="avatar" href="https://www.jianshu.com/u/1d099ce57442">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/ebeba7d28448" alt="96">
</a>          <div class="info">
            <span class="name"><a href="https://www.jianshu.com/u/1d099ce57442">张熙</a></span>
            <!-- 关注用户按钮 -->
            <a class="btn btn-success follow"><i class="iconfont ic-follow"></i><span>关注</span></a>
            <!-- 文章数据信息 -->
            <div class="meta">
              <!-- 如果文章更新时间大于发布时间，那么使用 tooltip 显示更新时间 -->
                <span class="publish-time" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="最后编辑于 2017.12.07 01:07">2017.04.25 21:41*</span>
              <span class="wordage">字数 4142</span>
            <span class="views-count">阅读 2237</span><span class="comments-count">评论 2</span><span class="likes-count">喜欢 26</span></div>
          </div>
          <!-- 如果是当前作者，加入编辑按钮 -->
        </div>

        <!-- 文章内容 -->
        <div data-note-content="" class="show-content">
          <div class="show-content-free">
            <p>1、传统我们的项目开发模式是产品调研提出需求，开发团队研究决定开发方案选型。然后开始一个周期的开发，模块开发完成之后开始模块间的联调。联调结束之后打包交付给测试团队。测试团队，系统测试或自动化测试，然后提交bug，开发团队修复bug，周而复始。<br></p><p>2、传统的模式中，存在着较多的不确定因素。例如，开发环境、编译环境、测试环境、生产环境，等不确定因素。人为介入打包中的不确定因素，缺乏单元测试和自动化测试的整合。从而导致的结果是，开发-测试-修复的周期较长，而且很多小的问题完全可以由单元测试进行覆盖。</p><p>持续交付并不是某个特定的软件，而是一个结果。这个结果要求团队可以随时的发布一个新的准确版本，而且要求在编译发布的过程中进行自动化测试，通过自动化测试可以及时的发现并定位存在的bug，修复bug之后再进行快速的发布到测试环境，测试团队直接进行测试。与传统模式的区别在于持续交付可以提前发现bug的存在和快速修复而不必等到测试人员的介入之后才发现。持续交付分解出来就是“持续”和“交付”。 &nbsp;持续 :持续要求任何时，候任何情况都能进行准确的发布，做到准确的发布需要注意以下几个关键点。</p><p>持续应该是一个周期性的，可以是每天的某个时间点，也可以是某次代码的提交，或者某次人为触发。所以人工进行构建是不可能的，需要自动化的构建，自动化要求构建的任何一个流程都必须以脚本的形式运行，代码检出、代码构建、各模块代码单元测试、集成测试、UI自动化测试等。</p><p>发布的程序版本不允许是各个模块在开发环境编译出一个版本作为交付，而要求在一个纯净的编译环境中进行构建。</p><p>构建的过程应该要求最大可能的固化，例如操作系统的版本，构建环境的版本，相关的依赖等。</p><p>避免从网络获取相关的文件，这点以nodejs为开发或编译的项目尤其重要，安装node的依赖包总是一个漫长的过程，就算有国内的源，一般的项目也需要一两分钟的node依赖包，这不符合快速构建。</p><p>交付 : 在持续编译的过程，使用自动化已经可以避免大多数的错误了。但是还是需要人为介入的系统测试，毕竟自动化的测试一般只能覆盖到70%左右。</p><p>根据我们团队内部推广这种工作方式的效果来看，持续集成确实让我们工作便利了许多， 每次代码的构建和自动化测试让我们及时发现存在的bug。好的工作模式也需要团队成员的遵守，团队成员应该积极的拥抱这种工作方式，团队成员需要做好以下几点。</p><p>使用版本工具例如git。git有强大的版本回溯，成员每次完成一个小的功能点进行代码提交。合并到master分支，持续交付工具应该配置为代码更新触发。团队内部应该等到持续交付流程结束之后，确认编译、自动化测试通过之后方可进行下一个版本的提交，这样容易定位bug。而不会导致这次bug影响团队内其他成员的工作。</p><p>主分支的代码bug不应该存留时间过长，避免团队内其他成员合并代码的时候引入其他问题。</p><p>测试驱动开发，任何一个新的功能开发都应该先写好单元测试脚本，并积极更新自动化测试脚本。并且积极地拥抱测试，虽然你明白这个测试不通过的问题并不会引起很大的系统性问题 ，但是还是应该进行修复而不是想方设法的跳过这个自动化测试。</p><p>临近下班的时候不要提交代码，这主要是因为遵守第2点。</p><p>Docker已经越来越火，CICD和Devops也是Docker一个重要的场景。在持续交付中使用Docker有一下优点。</p><p>Docker强大的环境隔离性可以将环境和程序打包在一起，测试、运维，人员无需知道我们的程序是如何配置的，只需要一条docker 的命令就可以将我们的程序运行起来，这也更加容易实现持续部署。</p><p>减少编译环境的污染，因为Docker天然的隔离性，也避免了传统编译环境难以配置多套编译环境的问题。在基于Docker的持续发布中，我们可以在同一台宿主机上同时编译不同版本的Java项目，不同版本的Python项目，而无需任何配置，镜像也只是从docker hub中获取。</p><p>持续集成</p><p>在持续集成方面，我们选择Jenkins。Jenkins是一款开源软件，拥有众多优秀的插件，依靠这些插件，我们可以完成一些周期、繁琐、复杂的任务。例如我们今天分享的持续发布，虽然Jenkins解决了我们繁琐复杂周期性的操作，但是没有解决我们在多种环境下编译构建的需求。而这个场景正是Docker的强项。通过Jenkins的pipeline我们可以实现代码检出、单元测试、编译、构建、发布、测试等流程的自动化，而最终通过Jenkins的Docker插件将产出物构建成镜像，方便部署到Docker环境。</p><p>持续部署</p><p>持续集成让我们新的代码源源不断的构建成了镜像，这些镜像经历了单元测试，自动化测试，但还没有接受过测试团队的严格测试。Jenkins是一个强大的持续集成工具，然而持续部署并不是Jenkins的强项，但是Jenkins拥有很多强大的插件。22.而且我们持续集成产出的是镜像，所以持续的部署，我们只需要将镜像运行起来，或者利用第三方的容器管理平台提供的API进行部署。</p><p>本地部署应用到Docker:本地部署到Docker容器可以使用Jenkins的docker插件，下面会介绍。</p><p>部署到远程主机的Docker、Appsoar。Docker和Appsoar都支持开启API调用。通过现有的API我们可以运行我们生成镜像版本。从而达到持续的部署最新版本。</p><p>部署到kubernetes。kubernetes除了可以通过API调用还可以在jenkins中配置kubectl的方式创建或更新deployments。</p><p>Docker中运行Jenkins:Docker部署Jenkins的方式简单方便，下面我们介绍用Docker的方式运行Jenkins。</p><div class="image-package">
<div class="image-container" style="max-width: 476px; max-height: 146px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 30.669999999999998%;"></div>
<div class="image-view" data-width="476" data-height="146"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-615e55e3ceccd1a5.png" data-original-width="476" data-original-height="146" data-original-format="image/png" data-original-filesize="8815" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-615e55e3ceccd1a5.png"></div>
</div>
<div class="image-caption"></div>
</div><p>这里将docker.sock和docker的可执行文件挂载到jenkins容器中，这样我们就可以在容器中使用docker了。</p><p>jenkins容器，默认的用户是jenkins因为我们需要使用docker所以我们需要使用root用户。</p><p>/var/jenkins_home的挂在卷是可选的，jenkins_home存放了所有任务、日志、认证、插件等jenkins运行后的文件。可做数据恢复使用。</p><p>配置Jenkins</p><p>1. 解锁jenkins:解锁的密码在容器的log中可以查看，或者直接查看jenkins_home指定文件</p><div class="image-package">
<div class="image-container" style="max-width: 667px; max-height: 631px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 94.6%;"></div>
<div class="image-view" data-width="667" data-height="631"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-e048ecb4e7490224.png" data-original-width="667" data-original-height="631" data-original-format="image/png" data-original-filesize="92751" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-e048ecb4e7490224.png"></div>
</div>
<div class="image-caption"></div>
</div><p>选择插件</p><div class="image-package">
<div class="image-container" style="max-width: 657px; max-height: 532px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 80.97%;"></div>
<div class="image-view" data-width="657" data-height="532"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-28fbf6c6371f3575.png" data-original-width="657" data-original-height="532" data-original-format="image/png" data-original-filesize="98938" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-28fbf6c6371f3575.png"></div>
</div>
<div class="image-caption"></div>
</div><p>创建Pipeline下面我们创建一个的Jenkins的Pipeline完成简单的cicd流程。</p><p>新建pipeline，在左侧新建选择pipeline。</p><p>在左侧的Credentials中新建git和镜像仓库的credentials</p><p>配置pipeline，例如定时触发，代码更新触发，webhook触发等。</p><p>在pipeline script中填入下面的demo.</p><p>以下是伪代码，仅提供思路</p><div class="image-package">
<div class="image-container" style="max-width: 700px; max-height: 611px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 81.03%;"></div>
<div class="image-view" data-width="754" data-height="611"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-3a11a36fb0b4cdb6.png" data-original-width="754" data-original-height="611" data-original-format="image/png" data-original-filesize="40864" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-3a11a36fb0b4cdb6.png"></div>
</div>
<div class="image-caption"></div>
</div><div class="image-package">
<div class="image-container" style="max-width: 700px; max-height: 209px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 29.07%;"></div>
<div class="image-view" data-width="719" data-height="209"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-a71579a9b138188c.png" data-original-width="719" data-original-height="209" data-original-format="image/png" data-original-filesize="15044" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-a71579a9b138188c.png"></div>
</div>
<div class="image-caption"></div>
</div><div class="image-package">
<div class="image-container" style="max-width: 660px; max-height: 268px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 40.61%;"></div>
<div class="image-view" data-width="660" data-height="268"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-02e03b852852fe24.png" data-original-width="660" data-original-height="268" data-original-format="image/png" data-original-filesize="15998" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-02e03b852852fe24.png"></div>
</div>
<div class="image-caption"></div>
</div><p>Jenkins pipeline的脚本语法是groovy的语法，其中docker 、Git是插件提供的能力。代码的执行流程如下：</p><div class="image-package">
<div class="image-container" style="max-width: 700px; max-height: 688px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 37.72%;"></div>
<div class="image-view" data-width="1824" data-height="688"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-a72035ef75ce0279.png" data-original-width="1824" data-original-height="688" data-original-format="image/png" data-original-filesize="266942" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-a72035ef75ce0279.png"></div>
</div>
<div class="image-caption"></div>
</div><p>通过Git插件获取最新代码到jenkins的工作区,例如`/var/jenkins_home/workspace/pipelineDemo。</p><p>docker.image().inside是如何编译我们的代码呢，通过查看Jenkins的console 可以看到如下log.</p><p>通过docker插件提供的能力构建镜像，Dockerfile存放在代码目录中。构建镜像后push到镜像仓库，私有仓库需要自行配置镜像仓库。</p><p>镜像构建完成之后就可以删掉旧版本，并重新运行一个新的版本。</p><div class="image-package">
<div class="image-container" style="max-width: 679px; max-height: 265px; background-color: transparent;">
<div class="image-container-fill" style="padding-bottom: 39.03%;"></div>
<div class="image-view" data-width="679" data-height="265"><img data-original-src="//upload-images.jianshu.io/upload_images/1585776-7635291be387ee4c.png" data-original-width="679" data-original-height="265" data-original-format="image/png" data-original-filesize="21073" class="" style="cursor: zoom-in;" src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1585776-7635291be387ee4c.png"></div>
</div>
<div class="image-caption"></div>
</div><p>熟悉Docker命令的朋友应该很容易理解了，原来是docker.image().inside启动的时候会将当前的目录挂在到容器中，然后在容器中执行./script/build.sh，这样我们就完成了利用容器中存在的环境做单元测试或构建编译了。</p><p>通过简单的例子，可见Jenkins和Docker的结合给CICD带来了足够的便利和强大。我们需要准备的只是一个编译的脚本，在编译脚本中可以使用任何的环境和任何的版本。</p><p>Pipeline 介绍</p><p>Jenkins的任务两个主要版本。</p><p>free style只是一个自动化的脚本，脚本类型为shell。所有的脚本在一台机器上运行，需要的环境需要提前准备。配置不集中，混乱。但是一般情况下还是够用的。</p><p>pipeline 是jenkins2的版本使用了一个基于groovy脚本的任务类型，通过一系列的stage将构建的不同部分组合成一个pipline。而且配合step可以完成异步操作。因为基于groovy可编程性更加</p><p>强大，而且脚本可以存放在源码中，脚本的更改不需要直接到jenkins中修改。</p><p>pipeline的一些使用经验和技巧</p><p>jenkins的资料较少，官网可以查看的内容也不多，一般的需求Jenkins内置的pipeline-syntax里面就有常用的命令生成器。可以满足大多数需求。</p><p>在pipeline脚本调试完成之后应该将脚本以文件的形式放在源码目录中，这样子方便修改。和多分支需要编译的情况下进行互相隔离。</p><p>应该多查找下相应的插件，而不是使用sh用执行脚本的方式来解决问题。</p><p>应该将jenkins_home目录挂在出来，如果遇上了Jenkins崩溃了可以及时的恢复数据。</p><p>应该新建一个定时的pipeline用来清理生成的镜像，减少硬盘资源的占用。</p><p>页面新建的pipeline,在页面删除之后，jenkins_home/workspace中对应的项目文件并不会被删除。</p><p>Q:请问kubernetes怎么结合jenkins做持续集成呢？</p><p>A:部署到kubernetes。kubernetes除了可以通过API调用还可以在jenkins中配置kubectl的方式创建或更新deployments。</p><p>Q: 必须通过pipeline才能实现jenkins把代码构建成docker镜像么？</p><p>A:不一定，使用docker主要是方便进行编译环境的隔离，也可以配置好NFS，构建完成之后复制到固定的服务器上，这个我们一般叫制品库</p><p>Q:docker目前官方的私有仓库registry并没有提供镜像删除功能，请问你们的镜像是如何进行版本管理的呢</p><p>A:&nbsp; Apphouse,是我们公司的一个镜像仓库产品基于Docker的registry,我们扩展了删除、复制，等功能。如果有兴趣的话可以到我们公司官网获取我们的Apphouse。</p><p>Q :Pipeline如何通过docker容器部署应用到不同的节点上去？发布遇到问题如何回滚版本的？</p><p>A:就如我前面的稿件中提到的，jenkins的能力更多的是做持续集成的功能，部署和回滚并不是Jenkins的强项，特别是回滚单依靠jenkins很难做到完美的方案。但是部署到不同的Docker的节点上，可以使用第三方的管理平台，例如Appsoar和卡k8s提供的API能力，可以进行部署。jenkins直接调用curl命令执行容器管理平台提供的API。</p><p>Q: pipeline的每个环节的报告如何快速获取？比如代码静态检查，工程构建，测试报告等等？</p><p>A:<a href="https://link.jianshu.com/?t=http://jenkins:8080/job/clearImages/86/wfapi/" target="_blank" rel="nofollow">http://jenkins:8080/job/clearImages/86/wfapi/</a></p><p>通过jenkins这个API，可以获取一些状态和时间信息，至于详细的代码静态检查，每种语言都有不同的语法检查。需要自行配置。当然详细的需要查看输出日志。</p><p>Q:怎么触发工作流的？</p><p>A: jenkins pipeline提供了三种方式（如果安装了SCM的插件可能有其他的方式触发），进入到pipeline的设置页面中的分别有。wbhook（触发远程构建 (例如,使用脚本)）、定时触发（Build periodically）、代码更新触发（Poll SCM）</p><p>Q: jenkins的编译环境是怎么处理的，实际用户的编译需求和环境都不一样。</p><p>A：用户需要清楚你使用的编译环境的基本情况，例如golang的编译环境，容器中的GOPATH是在什么位置，你需要将你ln到什么目录的代码放置在什么位置才能够编译，需要用户自己去研究构建环境的使用，</p><p>Q: jenkins里的有用户权限管理吗，贵公司的ci cd是怎么实现用户隔离的，每个用户只能看到自己的项目。</p><p>A：jenkins当中并没有用户权限。公司在研发的产品中，有一个虚拟的概念叫用户组，对应的是k8s中的一个或多个namespaces。管理员将成员用户添加到这个用户组中，组内成员创建的资源（pipeline、集群、服务，等）在组内是可见。用户组来进行逻辑概念上的隔离</p><p><br></p><p>Q:贵公司jenkins和kubernetes是怎么结合使用的？是什么的部署形式？<br></p><p>A:我看到很多朋友都提问了，jenkins如何跨主机部署或者如何部署到kubernetes集群，如何回滚。jenkins对这方面的能力比较弱，仅仅能够支持kube-api-server的调用而已，如果完全依靠jenkins是很难完成需求，所以我们的产品当中有一个专门对接kubernetes的deploy的模块，一个应用商店的模块，一个封装了jenkins的uflow模块，uflow模块向应用商店获取模板并根据当前编译构建出来的镜像tag号替换模板，并交付给deploy模块创建。回滚和升级都由deploy模块负责。这样各自分开，各司其职。</p><p><br></p><p><br></p><p><br></p><p><br></p><p>内容分享来自于 &nbsp;有容云Docker技术交流微信群</p>
          </div>
        </div>
    </div>

    <!-- 如果是付费文章，未购买，则显示购买按钮 -->

    <!-- 连载目录项 -->

    <!-- 如果是付费文章 -->
      <!-- 如果是付费连载，已购买，且作者允许赞赏，则显示付费信息和赞赏 -->
        <div id="free-reward-panel" class="support-author"><p>小礼物走一走，来简书关注我</p> <div class="btn btn-pay">赞赏支持</div> <div class="supporter"><ul class="support-list"></ul> <!----></div> <!----> <!----></div>

      <div class="show-foot">
        <a class="notebook" href="https://www.jianshu.com/nb/3242857">
          <i class="iconfont ic-search-notebook"></i>
          <span>日记本</span>
</a>        <div class="copyright" data-toggle="tooltip" data-html="true" data-original-title="转载请联系作者获得授权，并标注“简书作者”。">
          © 著作权归作者所有
        </div>
        <div class="modal-wrap" data-report-note="">
          <a id="report-modal">举报文章</a>
        </div>
      </div>

      <!-- 文章底部作者信息 -->
        <div class="follow-detail">
          <div class="info">
            <a class="avatar" href="https://www.jianshu.com/u/1d099ce57442">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/ebeba7d28448" alt="96">
</a>            <a class="btn btn-success follow"><i class="iconfont ic-follow"></i><span>关注</span></a>
            <a class="title" href="https://www.jianshu.com/u/1d099ce57442">张熙</a>
          <p>写了 6355 字，被 16 人关注，获得了 27 个喜欢</p></div>
        </div>

    <div class="meta-bottom">
      <div data-v-6ddd02c6="" class="like"><div data-v-6ddd02c6="" class="btn like-group"><div data-v-6ddd02c6="" class="btn-like"><a data-v-6ddd02c6="">喜欢</a></div> <div data-v-6ddd02c6="" class="modal-wrap"><a data-v-6ddd02c6="">26</a></div></div> <!----></div>
      <div class="share-group">
        <a class="share-circle" data-action="weixin-share" data-toggle="tooltip" data-original-title="分享到微信">
          <i class="iconfont ic-wechat"></i>
        </a>
        <a class="share-circle" data-action="weibo-share" data-toggle="tooltip" href="javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f=&#39;http://v.t.sina.com.cn/share/share.php?appkey=1881139527&#39;,u=z||d.location,p=[&#39;&amp;url=&#39;,e(u),&#39;&amp;title=&#39;,e(t||d.title),&#39;&amp;source=&#39;,e(r),&#39;&amp;sourceUrl=&#39;,e(l),&#39;&amp;content=&#39;,c||&#39;gb2312&#39;,&#39;&amp;pic=&#39;,e(p||&#39;&#39;)].join(&#39;&#39;);function%20a(){if(!window.open([f,p].join(&#39;&#39;),&#39;mb&#39;,[&#39;toolbar=0,status=0,resizable=1,width=440,height=430,left=&#39;,(s.width-440)/2,&#39;,top=&#39;,(s.height-430)/2].join(&#39;&#39;)))u.href=[f,p].join(&#39;&#39;);};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,&#39;&#39;,&#39;&#39;,&#39;&#39;, &#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》（ 分享自 @简书 ）&#39;,&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=weibo&#39;,&#39;页面编码gb2312|utf-8默认gb2312&#39;));" data-original-title="分享到微博">
          <i class="iconfont ic-weibo"></i>
        </a>
          <a class="share-circle" data-toggle="tooltip" href="http://cwb.assets.jianshu.io/notes/images/11747498/weibo/image_e71df7bd051d.jpg" target="_blank" data-original-title="下载长微博图片">
            <i class="iconfont ic-picture"></i>
          </a>
        <a class="share-circle more-share" tabindex="0" data-toggle="popover" data-placement="top" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="
          &lt;ul class=&quot;share-list&quot;&gt;
            &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone&#39;)+&#39;&amp;title=&#39;+e(&#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》&#39;),x=function(){if(!window.open(r,&#39;qzone&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-zone&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到QQ空间&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://twitter.com/share?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter&#39;)+&#39;&amp;text=&#39;+e(&#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》（ 分享自 @jianshucom ）&#39;)+&#39;&amp;related=&#39;+e(&#39;jianshucom&#39;),x=function(){if(!window.open(r,&#39;twitter&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-twitter&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到Twitter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=facebook&#39;,x=function(){if(!window.open(r,&#39;facebook&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-facebook&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到Facebook&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://plus.google.com/share?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=google_plus&#39;),x=function(){if(!window.open(r,&#39;google_plus&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-google&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到Google+&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:&#39;&#39;,r=&#39;http://www.douban.com/recommend/?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban&#39;)+&#39;&amp;title=&#39;+e(&#39;基于Docker的Jenkins pipeline工作流.&#39;)+&#39;&amp;sel=&#39;+e(s)+&#39;&amp;v=1&#39;,x=function(){if(!window.open(r,&#39;douban&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r+&#39;&amp;r=1&#39;};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-douban&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到豆瓣&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
          &lt;/ul&gt;
        " data-original-title="" title="">更多分享</a>
      </div>
    </div>
      <a id="web-note-ad-1" target="_blank" href="https://www.jianshu.com/apps/download?utm_source=nbc"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/web-note-ad-1-10f08e404d3887d2d45a4bc8f1831403.png" alt="Web note ad 1"></a>
    <div><div id="comment-list" class="comment-list"><div><form class="new-comment"><a class="avatar"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/avatar_default-78d4d1f68984cd6d4379508dd94b4210.png"></a> <div class="sign-container"><a href="https://www.jianshu.com/sign_in?utm_source=desktop&amp;utm_medium=not-signed-in-comment-form" class="btn btn-sign">登录</a> <span>后发表评论</span></div></form> <!----></div> <div id="normal-comment-list" class="normal-comment-list"><div><div><div class="top-title"><span>2条评论</span> <a class="author-only">只看作者</a> <a class="close-btn" style="display: none;">关闭评论</a> <div class="pull-right"><a class="active">按喜欢排序</a><a class="">按时间正序</a><a class="">按时间倒序</a></div></div></div> <!----> <!----> <div class="comments-placeholder" style="display: none;"><div class="author"><div class="avatar"></div> <div class="info"><div class="name"></div> <div class="meta"></div></div></div> <div class="text"></div> <div class="text animation-delay"></div> <div class="tool-group"><i class="iconfont ic-zan-active"></i><div class="zan"></div> <i class="iconfont ic-list-comments"></i><div class="zan"></div></div></div> <div id="comment-20090354" class="comment"><div><div class="author"><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="https://www.jianshu.com/u/7d1776ba66da" target="_blank" class="avatar"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/ab9dc33d-f2ed-4330-b10f-42b402c026c1"></a>  </div> <!----></div> <div class="info"><a href="https://www.jianshu.com/u/7d1776ba66da" target="_blank" class="name">Operfly</a> <!----> <!----> <div class="meta"><span>2楼 · 2018.01.29 16:59</span></div></div></div> <div class="comment-wrap"><p>最后一个问题解决很简单。jenkins将生产的镜像上传到私有的docker 仓库，kubernetes集群再从这个仓库里面拉取就可以了。</p> <div class="tool-group"><a data-v-cdecbe24="" id="like-button-20090354" class="like-button"><span data-v-cdecbe24="">赞</span></a> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div></div> <div class="sub-comment-list"><div id="comment-22924570" class="sub-comment"><p><div data-v-f3bf5228="" class="v-tooltip-container" style="z-index: 0;"><div class="v-tooltip-content"><a href="https://www.jianshu.com/u/5ffea1b71c75" target="_blank">Amoy_Sun</a>：
            </div> <!----></div> <span><a href="https://www.jianshu.com/users/7d1776ba66da" class="maleskine-author" target="_blank" data-user-slug="7d1776ba66da">@Operfly</a> 是git clone到workspace之后再inside进去吗</span></p> <div class="sub-tool-group"><span>2018.04.17 19:53</span> <a class=""><i class="iconfont ic-comment"></i> <span>回复</span></a> <!----> <!----></div></div> <div class="sub-comment more-comment"><a class="add-comment-btn"><i class="iconfont ic-subcomment"></i> <span>添加新评论</span></a> <!----> <!----> <!----></div> <!----></div></div></div></div> <!----> <div><!----></div></div></div>
  </div>

  <div class="side-tool"><ul><li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="回到顶部" style="display: none;"><a class="function-button"><i class="iconfont ic-backtop"></i></a></li> <!----> <!----> <!----> <li data-placement="left" data-toggle="tooltip" data-container="body" data-original-title="分享文章"><a tabindex="0" role="button" data-toggle="popover" data-placement="left" data-html="true" data-trigger="focus" href="javascript:void(0);" data-content="&lt;ul class=&#39;share-list&#39;&gt;
                &lt;li&gt;&lt;a class=&quot;weixin-share&quot;&gt;&lt;i class=&quot;social-icon-sprite social-icon-weixin&quot;&gt;&lt;/i&gt;&lt;span&gt;分享到微信&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;javascript:void((function(s,d,e,r,l,p,t,z,c){var%20f=&#39;http://v.t.sina.com.cn/share/share.php?appkey=1881139527&#39;,u=z||d.location,p=[&#39;&amp;url=&#39;,e(u),&#39;&amp;title=&#39;,e(t||d.title),&#39;&amp;source=&#39;,e(r),&#39;&amp;sourceUrl=&#39;,e(l),&#39;&amp;content=&#39;,c||&#39;gb2312&#39;,&#39;&amp;pic=&#39;,e(p||&#39;&#39;)].join(&#39;&#39;);function%20a(){if(!window.open([f,p].join(&#39;&#39;),&#39;mb&#39;,[&#39;toolbar=0,status=0,resizable=1,width=440,height=430,left=&#39;,(s.width-440)/2,&#39;,top=&#39;,(s.height-430)/2].join(&#39;&#39;)))u.href=[f,p].join(&#39;&#39;);};if(/Firefox/.test(navigator.userAgent))setTimeout(a,0);else%20a();})(screen,document,encodeURIComponent,&#39;&#39;,&#39;&#39;,&#39;&#39;, &#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》（ 分享自 @简书 ）&#39;,&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=weibo&#39;,&#39;页面编码gb2312|utf-8默认gb2312&#39;));&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-weibo&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到微博&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                
                &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=qzone&#39;)+&#39;&amp;title=&#39;+e(&#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》&#39;),x=function(){if(!window.open(r,&#39;qzone&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-zone&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到QQ空间&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://twitter.com/share?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=twitter&#39;)+&#39;&amp;text=&#39;+e(&#39;推荐 张熙 的文章《基于Docker的Jenkins pipeline工作流.》（ 分享自 @jianshucom ）&#39;)+&#39;&amp;related=&#39;+e(&#39;jianshucom&#39;),x=function(){if(!window.open(r,&#39;twitter&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=600,height=600&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-twitter&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到Twitter&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://www.facebook.com/dialog/share?app_id=483126645039390&amp;display=popup&amp;href=https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=facebook&#39;,x=function(){if(!window.open(r,&#39;facebook&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-facebook&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到Facebook&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,r=&#39;https://plus.google.com/share?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=google_plus&#39;),x=function(){if(!window.open(r,&#39;google_plus&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})();&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-google&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到Google+&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;javascript:void(function(){var d=document,e=encodeURIComponent,s1=window.getSelection,s2=d.getSelection,s3=d.selection,s=s1?s1():s2?s2():s3?s3.createRange().text:&#39;&#39;,r=&#39;http://www.douban.com/recommend/?url=&#39;+e(&#39;https://www.jianshu.com/p/7e1e8d8e8ec5?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=reader_share&amp;utm_source=douban&#39;)+&#39;&amp;title=&#39;+e(&#39;基于Docker的Jenkins pipeline工作流.&#39;)+&#39;&amp;sel=&#39;+e(s)+&#39;&amp;v=1&#39;,x=function(){if(!window.open(r,&#39;douban&#39;,&#39;toolbar=0,resizable=1,scrollbars=yes,status=1,width=450,height=330&#39;))location.href=r+&#39;&amp;r=1&#39;};if(/Firefox/.test(navigator.userAgent)){setTimeout(x,0)}else{x()}})()&quot;&gt;&lt;i class=&#39;social-icon-sprite social-icon-douban&#39;&gt;&lt;/i&gt;&lt;span&gt;分享到豆瓣&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
              &lt;/ul&gt;" data-original-title="" title="" class="function-button"><i class="iconfont ic-share"></i></a> <!----></li> <!----></ul></div>
</div>
<div class="note-bottom">
  <div><div class="main"><div class="title">被以下专题收入，发现更多相似内容</div> <!----> <div class="include-collection"><!----> <a href="https://www.jianshu.com/c/c5e5fc8c5094?utm_source=desktop&amp;utm_medium=notes-included-collection" target="_blank" class="item"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/crop1516897655839.jpg"><div class="name">Jenkins</div></a><a href="https://www.jianshu.com/c/72fa756b8b34?utm_source=desktop&amp;utm_medium=notes-included-collection" target="_blank" class="item"><img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/crop1526996846313.jpg"><div class="name">持续集成</div></a> <!----></div></div> <!----> <!----></div>
  <div><div class="recommend-note"><div class="meta"><div class="title">
        推荐阅读
        <a target="_blank" href="https://www.jianshu.com/" class="more">
           更多精彩内容<i class="iconfont ic-link"></i></a></div></div> <div class="list"><div class="note have-img"><a target="_blank" href="https://www.jianshu.com/p/74f9ea55b1c3?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="cover" style="background-image: url(&quot;//upload-images.jianshu.io/upload_images/1585776-e079f492cff16a11.png?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240&quot;);"></a> <a target="_blank" href="https://www.jianshu.com/p/74f9ea55b1c3?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="title">Docker环境部署</a> <p class="description">背景 为什么使用docker 1.为了实现开发、测试、生产环境的一致性，项目更快的交付与部署。 2.即启即用，易创建、扩展和销毁,对于服务器的部署尝试极其方便。 为什么不使用虚拟机(vbox)，跟docker区别在哪里 1.器和虚拟机仅仅相似于它们都提供了隔离环境。从简单开发使用的角度来说，docker比vbox之类搭建的虚拟机(centos)更方便快捷。 2.但在简单使用后还是需要深入理解他们之间的区别：vm与docker框架，直观上来讲vm多了一层guest OS，同时Hypervisor会对硬件资源进行虚拟化，docker直接使用硬件资源，所以资源利用率相对docker低也是比较容...</p> <a target="_blank" href="https://www.jianshu.com/u/1d099ce57442?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="author"><div class="avatar" style="background-image: url(&quot;//upload.jianshu.io/users/upload_avatars/1585776/ebeba7d28448?imageMogr2/auto-orient/strip|imageView2/1/w/24/h/24&quot;);"></div> <span class="name">张熙</span></a></div><div class="note have-img"><a target="_blank" href="https://www.jianshu.com/p/b09133f78634?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="cover" style="background-image: url(&quot;//upload-images.jianshu.io/upload_images/3627484-bde1da5fec638400.png?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240&quot;);"></a> <a target="_blank" href="https://www.jianshu.com/p/b09133f78634?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="title">写小说，其实并不难</a> <p class="description">很多人的心里，都藏着一个成为小说家的梦想。可同时，这似乎又是个难以企及的梦想。 有的人，绞尽脑汁，却构思不出一个精彩有趣的故事，于是，还没等真正落笔，便不得不宣告放弃。 有的人，终于终于冥思苦想出一个自以为不错的创意，接下来却失望地发现，那是一个早已被前人用过的老梗。 有的人，连故事大纲都完成了，但小说写到一半，却发现难以为继，写不下去了。 有的人，虽然故事构思得很精彩，但是笔下的角色却像是演技不在线的演员，或生硬，或做作，让读者嫌弃。 还有的人，笔下没有逻辑，任凭自己的喜好铺设情节、塑造人物，结果，不是写成了贻笑大方的“抗日神剧”，就是写出了满篇自恋的“玛丽苏”“杰克苏”。 …… 以上...</p> <a target="_blank" href="https://www.jianshu.com/u/21f7a43b95ce?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="author"><div class="avatar" style="background-image: url(&quot;//upload.jianshu.io/users/upload_avatars/568006/a9b62c85-a534-440a-b5ca-73a3918916ea.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/24/h/24&quot;);"></div> <span class="name">李陌359</span></a></div><div class="note have-img"><a target="_blank" href="https://www.jianshu.com/p/8c5c225e116d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="cover" style="background-image: url(&quot;//upload-images.jianshu.io/upload_images/146549-2982e93aaee1478e.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240&quot;);"></a> <a target="_blank" href="https://www.jianshu.com/p/8c5c225e116d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="title">不是生活太无聊，只是你还不够有趣</a> <p class="description">自从去年参加了深圳伙伴圈的年终分享会，写下了自己2018的梦想清单之后，我的生活都变得充满了激情与能量。 最近的生活一直在践行“做喜欢的事，认识有趣的人”，立志将每一天过成一个惊叹号。 1.人面不知何处去，桃花依旧笑春风。 女生大概都是爱花的。即便嘴上会嫌花束太贵浪费钱，但收到花的喜悦是怎么也藏不住的。 还记得何先生第一次真正意义上的送花，是在我们恋爱四周年的那一天。那时候，我们还是异地恋。我并不知道会有什么样的惊喜，但我一直期待着。 直到接到外卖员的电话，要我去学校门口取花，才知道他特地定了一束花。清楚地记得，在去取花的路上，我一个人傻傻地笑着，笑了一路。那种笑，是抑制不住，发自内心的...</p> <a target="_blank" href="https://www.jianshu.com/u/99505a587f3b?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="author"><div class="avatar" style="background-image: url(&quot;//upload.jianshu.io/users/upload_avatars/146549/0d52e035-b162-4400-a3af-a0597505812d.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/24/h/24&quot;);"></div> <span class="name">翊优</span></a></div><div class="note have-img"><a target="_blank" href="https://www.jianshu.com/p/cff561691817?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="cover" style="background-image: url(&quot;//upload-images.jianshu.io/upload_images/10681280-7cc498ee6f61807a.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240&quot;);"></a> <a target="_blank" href="https://www.jianshu.com/p/cff561691817?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="title">当大一的我，拿到第一笔稿费</a> <p class="description">01过程-百折千回 今年2月17日，我决定写稿赚钱。 2月22日，我写好了第一篇稿子《你觉得什么是爱情最好的样子》并把它投给了某平台。 2月28日，一直没收到回复，便投给了简书。 3月2日，我决定再写一篇投稿文章，但稿子写了又改，改了又删。果然书读得太少，写不出什么东西。终于，我抱着随便写点东西的目的，写出了第二篇文章《你只需要一句话的时间，我却要花几年》，并将文章直接投给了简书。 3月3日，我乱七八糟地写了两篇文章，并抱着试一试的心态，投给了某些小众平台。 至今无果。 一直到3月6日，我都在写稿与投稿中度过，也更加透彻地领悟了两个关于海的成语——泥牛入海和石沉大海。 越是临近开学，我对...</p> <a target="_blank" href="https://www.jianshu.com/u/f655e5206b38?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="author"><div class="avatar" style="background-image: url(&quot;//upload.jianshu.io/users/upload_avatars/10681280/111928d1-6c1b-4306-9dce-28aca4b6cbfa.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/24/h/24&quot;);"></div> <span class="name">李八书</span></a></div><div class="note"><!----> <a target="_blank" href="https://www.jianshu.com/p/65552243b805?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="title">「树洞」发现恋爱五年的男朋友嫖娼，我该怎么办？</a> <p class="description">本人大二女，和男朋友从高一开始交往。一开始父母不同意，后来发现并不影响成绩，态度就慢慢缓和，后来比较支持。高考都过了一本线，两个人都在长沙，但是不在同一所学校。大一的时候去见了他的爸妈，两个老人家挺喜欢我。 对于性这方面，因为我们都是农村的，所以都比较保守。我们之前约定好，等大学毕业就结婚，那时候我再把第一次给他。在这之前，我们也就牵牵手，接接吻，没有做过什么更进一步的事，就算一起出去旅游，也订双人房，各睡各的。 前几天我们一起去西塘玩，他洗碗的时候手机放床上，屏幕突然亮了。我拿起来看，有人给他发微信，是个女的。我平时都不怎么看他手机的，那天念头一动，把他微信打开，才知道他在外面嫖娼。他...</p> <a target="_blank" href="https://www.jianshu.com/u/0c50451b064a?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=pc_all_hots&amp;utm_source=recommendation" class="author"><div class="avatar" style="background-image: url(&quot;//upload.jianshu.io/users/upload_avatars/6906505/0c486657-46f4-440b-a49b-03df95a58686.png?imageMogr2/auto-orient/strip|imageView2/1/w/24/h/24&quot;);"></div> <span class="name">简书树洞</span></a></div></div></div></div>
  <!-- 相关文章 -->
  <div class="seo-recommended-notes">

        <div class="note ">
                    <a class="title" target="_blank" href="https://www.jianshu.com/p/7745d8ddd2dc?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">Docker — 云时代的程序分发方式</a>
          <p class="description">Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件？Google Compute Engine 的正式发布？Azure入华？还是AWS落地中国？留在每个人大脑中的印象可能各不相同，但要是让笔者来排名的话那么Docker绝对应该算是第一位的。如果你之前...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/9ff225ce5e1a?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/053736143b89.png" alt="48">
            </div>
            <span class="name">ahohoho</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/cf6e7248b6c7?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/6171922-c1560cdac2f7bbab.png" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/cf6e7248b6c7?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">从零开始学习 Docker</a>
          <p class="description">这篇文章是我学习 Docker 的记录,大部分内容摘抄自 &lt;&lt;Docker — 从入门到实践&gt;&gt; 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的实践记录. 最近工作中遇到项目部署的问题,因为原先旧项目还需要继续在线服役,所以生产环境的一整套东西一...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/666067560d68?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/ca35e97b-77e1-4fae-b16f-ca948c0f6fcf" alt="48">
            </div>
            <span class="name">My_Oh_My</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/63710330ad36?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/5776456-d4886bda9833f806.png" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/63710330ad36?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">&lt;&lt;互联网敏捷DevOps和自动化之5.SCM和持续集成&gt;&gt;</a>
          <p class="description">&lt;&lt;互联网敏捷DevOps和自动化之5.持续集成&gt;&gt;持续集成的价值是什么？对于开发和测试人员又意味着什么呢？1.1 持续集成介绍使用持续集成和测试驱动开发的敏捷实践 说到持续集成，我们就不得不提到源代码管理，尤其是互联网得今天源代码得管理至关重要，分之策略和代码合并，代码r...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/d2f49eb35efe?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/52e038ce-e065-4f71-b781-faf762e040bc.jpg" alt="48">
            </div>
            <span class="name">IT诸葛亮</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/358bfb64e3a6?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/4742055-9aa2fb7db42e4652.png" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/358bfb64e3a6?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">基于Jenkins，docker实现自动化部署（持续交互）</a>
          <p class="description">前言 随着业务的增长，需求也开始增多，每个需求的大小，开发周期，发布时间都不一致。基于微服务的系统架构，功能的叠加，对应的服务的数量也在增加，大小功能的快速迭代，更加要求部署的快速化，智能化。因此，传统的人工部署已经心有余而力不足。持续集成，持续部署，持续交互对于微服务开发...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/df023c89c621?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/f1d7e3bd-fb98-4cc9-8a4a-33278de0d0f1.png" alt="48">
            </div>
            <span class="name">不小下</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/119dddd55cdb?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1760830-24c77732cf9dc4cd" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/119dddd55cdb?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">云端基于Docker的微服务与持续交付实践</a>
          <p class="description">云端基于Docker的微服务与持续交付实践 本文根据〖2016 全球运维大会•深圳站〗现场演讲嘉宾分享内容整理而成，编辑同学为吴召军@腾讯。 欢迎关注“高效运维(微信ID：greatops)”公众号，以抢先赏阅干货满满的各种原创文章。 讲师简介 易立 毕业于北京大学，获得学...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/d1efae5b9216?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/6abe022f-076d-4384-b15d-b8e4f6e815f0.jpg" alt="48">
            </div>
            <span class="name">meng_philip123</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/1351915d57ae?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/4193685-fa57d8bca7a4ee5c.jpg" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/1351915d57ae?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">拓跋焘开疆拓土，北凉朝不保夕</a>
          <p class="description">北魏在历年的东征西讨之下，实力不断增强，对西部的北凉有了吞并之心，遂派出太常李顺，出使北凉。 李顺到达姑臧城后，北凉王沮渠蒙逊派人对他说：“我年老多病，腰腿不太灵便，不能下跪叩拜，等三五天稍稍好转后，再与你相见。” 李顺说：“你年迈多病，朝廷早就知道，怎么可以自己苟且偷安，...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/bcf2cc21057f?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/022e16ab-f4b2-4c56-8572-d6a790c40fc4.png" alt="48">
            </div>
            <span class="name">寒七琪</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/1597a7b0953c?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/7759290-94268bd1f59a5714.jpg" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/1597a7b0953c?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">我们各自有各自的命运。</a>
          <p class="description">我们各自有各自的命运，谁也拯救不了谁，而我接受我的命运。生活就是这样，实在觉得痛苦人还是应该去相信些什么的，信个善恶有报，信个因果轮回。总之得找到自己的排泄方式，你这辈子受苦了，下辈子会好过的，所以加油。</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/8f0f7e40def6?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/caf8e423-4246-4514-bf4c-eba7310950bb.jpg" alt="48">
            </div>
            <span class="name">懒追随</span>
</a>        </div>

        <div class="note ">
                    <a class="title" target="_blank" href="https://www.jianshu.com/p/3a448f857c1d?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">scrollView滚动导航条渐变</a>
          <p class="description">很多时候 项目中要求导航栏的颜色随着scrollview的滚动发生渐变,于是自己就写了一个demo没方法比较简单 写一个UINavigationBar的分类 在分类的.h文件中声明两个方法 #import@interface UINavigationBar (LH) - (...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/654e14105027?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/e5553d05-12de-4403-95aa-036d15817f68.jpeg" alt="48">
            </div>
            <span class="name">薰衣草儿</span>
</a>        </div>

        <div class="note have-img">
          <a class="cover" target="_blank" href="https://www.jianshu.com/p/eb5acaeb4985?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/6990945-382d05327a2e636f.jpg" alt="240">
</a>          <a class="title" target="_blank" href="https://www.jianshu.com/p/eb5acaeb4985?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">梦境是用来写作的</a>
          <p class="description">依靠梦境写作 依靠梦境写作，无非是最有效的一种写作方式。 早在西方历史早期，人类就把梦当作上帝带来的信息，就连我国古时候也有“梦中杀人”“庄周梦蝶”之类的说法。可见它们的共同之处:梦境都能给人们带来某种启示。各类神明在梦中出现，从而使人们有了信仰，有了崇拜的对象，有了文明。...</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/ea4df844bd81?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/597efc71-37c0-4f9e-9ea6-27e86ae86588.jpg" alt="48">
            </div>
            <span class="name">小谷店</span>
</a>        </div>

        <div class="note ">
                    <a class="title" target="_blank" href="https://www.jianshu.com/p/8f569347c4ef?utm_campaign=maleskine&amp;utm_content=note&amp;utm_medium=seo_notes&amp;utm_source=recommendation">今天的风</a>
          <p class="description">黄浦江畔 风 与落叶一起探戈 与我慢摇 轮船发出一声鸣响，它不禁问 你是哪里来的舞者 风答 不要问我的故乡 我是云一般的精灵</p>
          <a class="author" target="_blank" href="https://www.jianshu.com/u/a204982f9e10?utm_campaign=maleskine&amp;utm_content=user&amp;utm_medium=seo_notes&amp;utm_source=recommendation">
            <div class="avatar">
              <img src="./基于Docker的Jenkins pipeline工作流. - 简书_files/1acc3f1c03fc" alt="48">
            </div>
            <span class="name">penny胖妮</span>
</a>        </div>
  </div>
</div>

    <script type="application/json" data-name="page-data">{"user_signed_in":false,"locale":"zh-CN","os":"windows","read_mode":"day","read_font":"font2","note_show":{"is_author":false,"is_following_author":false,"is_liked_note":false,"follow_state":0,"uuid":"33137296-dfaa-4e62-b8f7-8a721571663e"},"note":{"id":11747498,"slug":"7e1e8d8e8ec5","user_id":1585776,"notebook_id":3242857,"commentable":true,"likes_count":26,"views_count":2237,"public_wordage":4142,"comments_count":2,"featured_comments_count":0,"total_rewards_count":0,"is_author":false,"paid_type":"free","paid":false,"paid_content_accessible":false,"author":{"nickname":"张熙","total_wordage":6355,"followers_count":16,"total_likes_count":27}}}</script>
    
    <script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/babel-polyfill-e9c9b9785eb2c39c58e4.js.下载" crossorigin="anonymous"></script>
    <script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/web-base-2d541906cef5dcf0fd22.js.下载" crossorigin="anonymous"></script>
<script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/web-211e04d27fb3d9764421.js.下载" crossorigin="anonymous"></script>
    
    <script src="./基于Docker的Jenkins pipeline工作流. - 简书_files/entry-086fe40459dbedd0b3b8.js.下载" crossorigin="anonymous"></script>
    <script>
  (function(){
      var bp = document.createElement('script');
      var curProtocol = window.location.protocol.split(':')[0];
      if (curProtocol === 'https') {
          bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
      }
      else {
          bp.src = 'http://push.zhanzhang.baidu.com/push.js';
      }
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(bp, s);
  })();
</script>

  

<!----><!----></body></html>